Class: GettextI18nRails::ModelAttributesFinder

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

Instance Method Summary collapse

Constructor Details

#initializeModelAttributesFinder

Returns a new instance of ModelAttributesFinder.



44
45
46
47
# File 'lib/gettext_i18n_rails/model_attributes_finder.rb', line 44

def initialize
  connection = ::ActiveRecord::Base.connection
  @existing_tables = (Rails::VERSION::MAJOR >= 5 ? connection.data_sources : connection.tables)
end

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)


86
87
88
89
# File 'lib/gettext_i18n_rails/model_attributes_finder.rb', line 86

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



52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/gettext_i18n_rails/model_attributes_finder.rb', line 52

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) && @existing_tables.include?(model.table_name)
    model.columns.reject { |c| ignored?(c.name, ignored_cols) }.collect { |c| c.name }
  else
    []
  end
end

#modelsObject



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/gettext_i18n_rails/model_attributes_finder.rb', line 66

def models
  if Rails::VERSION::MAJOR >= 3
    Rails.application.eager_load! # make sure that all models are loaded so that direct_descendants works
    descendants = ::ActiveRecord::Base.direct_descendants

    # In rails 5+ user models are supposed to inherit from ApplicationRecord
    if defined?(::ApplicationRecord)
      descendants += ApplicationRecord.direct_descendants
      descendants.delete ApplicationRecord
    end

    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