class Mobility::Backends::Sequel::Table
Implements the {Mobility::Backends::Table} backend for Sequel
models.
Public Class Methods
@param [Symbol] name Attribute name @param [Symbol] locale Locale @return [Sequel::SQL::QualifiedIdentifier]
# File lib/mobility/backends/sequel/table.rb, line 51 def build_op(attr, locale) ::Sequel::SQL::QualifiedIdentifier.new(table_alias(locale), attr || :value) end
@!group Backend
Configuration @option options [Symbol] association_name (:translations) Name of association method @option options [Symbol] table_name Name of translation table @option options [Symbol] foreign_key Name of foreign key @option options [Symbol] subclass_name Name of subclass to append to model class to generate translation class @raise [CacheRequired] if cache option is false
# File lib/mobility/backends/sequel/table.rb, line 33 def configure(options) raise CacheRequired, "Cache required for Sequel::Table backend" if options[:cache] == false table_name = Util.singularize(model_class.table_name) options[:table_name] ||= :"#{table_name}_translations" options[:foreign_key] ||= Util.foreign_key(Util.camelize(table_name.downcase)) if association_name = options[:association_name] options[:subclass_name] ||= Util.camelize(Util.singularize(association_name)) else options[:association_name] = :translations options[:subclass_name] ||= :Translation end %i[table_name foreign_key association_name subclass_name].each { |key| options[key] = options[key].to_sym } end
@param [Sequel::Dataset] dataset Dataset to prepare @param [Object] predicate Predicate @param [Symbol] locale Locale @return [Sequel::Dataset] Prepared dataset
# File lib/mobility/backends/sequel/table.rb, line 59 def prepare_dataset(dataset, predicate, locale) join_translations(dataset, locale, visit(predicate, locale)) end
@return [Symbol] class for translations
# File lib/mobility/backends/sequel/table.rb, line 23 def translation_class @translation_class ||= model_class.const_get(subclass_name) end
Private Class Methods
# File lib/mobility/backends/sequel/table.rb, line 65 def join_translations(dataset, locale, join_type) if joins = dataset.opts[:join] return dataset if joins.any? { |clause| clause.table_expr.alias == table_alias(locale) } end dataset.join_table(join_type, translation_class.table_name, { locale: locale.to_s, foreign_key => ::Sequel[model_class.table_name][:id] }, table_alias: table_alias(locale)) end
@return [Symbol] Join type
# File lib/mobility/backends/sequel/table.rb, line 79 def visit(predicate, locale) case predicate when Array visit_collection(predicate, locale) when ::Sequel::SQL::QualifiedIdentifier visit_sql_identifier(predicate, locale) when ::Sequel::SQL::BooleanExpression visit_boolean(predicate, locale) when ::Sequel::SQL::Expression visit(predicate.args, locale) else nil end end
# File lib/mobility/backends/sequel/table.rb, line 106 def visit_boolean(boolean, locale) if boolean.op == :'=' boolean.args.any? { |op| visit(op, locale) } && :inner || nil elsif boolean.op == :IS boolean.args.any?(&:nil?) && :left_outer || nil elsif boolean.op == :OR boolean.args.any? { |op| visit(op, locale) } && :left_outer || nil else visit(boolean.args, locale) end end
# File lib/mobility/backends/sequel/table.rb, line 94 def visit_collection(collection, locale) collection.map { |obj| visit(obj, locale).tap do |visited| return visited if visited == :inner end }.compact.first end
# File lib/mobility/backends/sequel/table.rb, line 102 def visit_sql_identifier(identifier, locale) (table_alias(locale) == identifier.table) && :inner || nil end
Public Instance Methods
# File lib/mobility/backends/sequel/table.rb, line 17 def translation_class self.class.translation_class end
# File lib/mobility/backends/sequel/table.rb, line 161 def translation_for(locale, **) translation = model.send(association_name).find { |t| t.locale == locale.to_s } translation ||= translation_class.new(locale: locale) translation end