Class: GettextI18nRails::ModelAttributesFinder

Inherits:
Object
  • Object
show all
Defined in:
lib/gettext_i18n_rails/model_attributes_finder.rb

Instance Method Summary collapse

Instance Method Details

#find(options) ⇒ Object

options:

:ignore_tables => ['cars',/_settings$/,...]
:ignore_columns => ['id',/_id$/,...]

current connection —> href="'model_name','type'">cars’=>,…



35
36
37
38
39
40
41
42
# File 'lib/gettext_i18n_rails/model_attributes_finder.rb', line 35

def find(options)
  found = ActiveSupport::OrderedHash.new([])
  models.each do |model|
    attributes = model_attributes(model, options[:ignore_tables], options[:ignore_columns])
    found[model] = attributes.sort if attributes.any?
  end
  found
end

#ignored?(name, patterns) ⇒ Boolean

Returns:

  • (Boolean)


73
74
75
76
# File 'lib/gettext_i18n_rails/model_attributes_finder.rb', line 73

def ignored?(name,patterns)
  return false unless patterns
  patterns.detect{|p|p.to_s==name.to_s or (p.is_a?(Regexp) and name=~p)}
end

#model_attributes(model, ignored_tables, ignored_cols) ⇒ Object

Rails < 3.0 doesn’t have DescendantsTracker. Instead of iterating over ObjectSpace (slow) the decision was made NOT to support class hierarchies with abstract base classes in Rails 2.x



47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/gettext_i18n_rails/model_attributes_finder.rb', line 47

def model_attributes(model, ignored_tables, ignored_cols)
  return [] if model.abstract_class? && Rails::VERSION::MAJOR < 3
  
  if model.abstract_class?
    model.direct_descendants.reject {|m| ignored?(m.table_name, ignored_tables)}.inject([]) do |attrs, m|
      attrs.push(model_attributes(m, ignored_tables, ignored_cols)).flatten.uniq
    end
  elsif !ignored?(model.table_name, ignored_tables)
    model.columns.reject { |c| ignored?(c.name, ignored_cols) }.collect { |c| c.name }
  else
    []
  end
end

#modelsObject



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/gettext_i18n_rails/model_attributes_finder.rb', line 61

def models
  if Rails::VERSION::MAJOR > 2
    Rails.application.eager_load! # make sure that all models are loaded so that direct_descendants works
    ::ActiveRecord::Base.direct_descendants
  else
    ::ActiveRecord::Base.connection.tables \
      .map { |t| table_name_to_namespaced_model(t) } \
      .compact \
      .collect { |c| c.superclass.abstract_class? ? c.superclass : c }
  end.uniq.sort_by(&:name)
end