class Mobility::Plugins::Sequel::Query::VirtualRow
Internal class to create a “clean room” for manipulating translated attribute nodes in an instance-eval'ed block. Inspired by Sequel's (much more sophisticated) virtual rows.
Attributes
backends[R]
locales[R]
Public Class Methods
build_query(klass, locale, &block)
click to toggle source
# File lib/mobility/plugins/sequel/query.rb, line 72 def build_query(klass, locale, &block) ::Mobility.validate_locale!(locale) row = new(klass, locale) query = block.arity.zero? ? row.instance_eval(&block) : block.call(row) if ::Sequel::Dataset === query predicates = query.opts[:where] prepare_datasets(query, row.backends, row.locales, predicates) else prepare_datasets(klass.dataset, row.backends, row.locales, query).where(query) end end
new(model_class, global_locale)
click to toggle source
# File lib/mobility/plugins/sequel/query.rb, line 53 def initialize(model_class, global_locale) @model_class, @global_locale, @backends, @locales = model_class, global_locale, [], [] end
Private Class Methods
prepare_datasets(dataset, backends, locales, predicates)
click to toggle source
# File lib/mobility/plugins/sequel/query.rb, line 88 def prepare_datasets(dataset, backends, locales, predicates) backends.inject(dataset) do |dataset_, b| locales.inject(dataset_) do |ds, locale| b.prepare_dataset(ds, predicates, locale) end end end
Public Instance Methods
method_missing(m, *args)
click to toggle source
Calls superclass method
# File lib/mobility/plugins/sequel/query.rb, line 57 def method_missing(m, *args) if @model_class.mobility_attribute?(m) @backends |= [@model_class.mobility_backend_class(m)] ::Mobility.validate_locale!(args[0]) if args[0] locale = args[0] || @global_locale @locales |= [locale] @model_class.mobility_backend_class(m).build_op(m.to_s, locale) elsif @model_class.columns.include?(m.to_s) ::Sequel::SQL::QualifiedIdentifier.new(@model_class.table_name, m) else super end end