class GettextI18nRails::ModelAttributesFinder
Public Instance Methods
find(options)
click to toggle source
options:
:ignore_tables => ['cars',/_settings$/,...] :ignore_columns => ['id',/_id$/,...]
current connection —> {‘cars’=>,…}
# File lib/gettext_i18n_rails/model_attributes_finder.rb, line 35 def find(options) found = ActiveSupport::OrderedHash.new([]) models.each do |model| table_name = model.table_name next if ignored?(table_name,options[:ignore_tables]) model.columns.each do |column| found[model] += [column.name] unless ignored?(column.name,options[:ignore_columns]) end found[model].sort! end found end
ignored?(name,patterns)
click to toggle source
# File lib/gettext_i18n_rails/model_attributes_finder.rb, line 59 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
models()
click to toggle source
# File lib/gettext_i18n_rails/model_attributes_finder.rb, line 50 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) } end.compact.sort {|c1, c2| c1.name <=> c2.name} end
Private Instance Methods
table_name_to_namespaced_model(table_name)
click to toggle source
Tries to find the model class corresponding to specified table name. Takes into account that the model can be defined in a namespace. Searches only up to one level deep - won’t find models nested in two or more modules.
Note that if we allow namespaces, the conversion can be ambiguous, i.e. if the table is named “aa_bb_cc” and AaBbCc, Aa::BbCc and AaBb::Cc are all defined there’s no absolute rule that tells us which one to use. This method prefers the less nested one and, if there are two at the same level, the one with shorter module name.
# File lib/gettext_i18n_rails/model_attributes_finder.rb, line 75 def table_name_to_namespaced_model(table_name) # First assume that there are no namespaces model = to_class(table_name.singularize.camelcase) return model if model != nil # If you were wrong, assume that the model is in a namespace. # Iterate over the underscores and try to substitute each of them # for a slash that camelcase() replaces with the scope operator (::). underscore_position = table_name.index('_') while underscore_position != nil namespaced_table_name = table_name.dup namespaced_table_name[underscore_position] = '/' model = to_class(namespaced_table_name.singularize.camelcase) return model if model != nil underscore_position = table_name.index('_', underscore_position + 1) end # The model either is not defined or is buried more than one level # deep in a module hierarchy return nil end
to_class(name)
click to toggle source
Checks if there is a class of specified name and if so, returns the class object. Otherwise returns nil.
# File lib/gettext_i18n_rails/model_attributes_finder.rb, line 100 def to_class(name) # I wanted to use Module.const_defined?() here to avoid relying # on exceptions for normal program flow but it's of no use. # If class autoloading is enabled, the constant may be undefined # but turn out to be present when we actually try to use it. begin constant = name.constantize rescue NameError return nil end return constant.is_a?(Class) ? constant : nil end