Module: DelegateAllFor
- Defined in:
- lib/delegate_all_for.rb,
lib/delegate_all_for/version.rb
Constant Summary collapse
- VERSION =
"0.0.9"
Instance Method Summary collapse
-
#delegate_all_for(*attr_names) ⇒ Object
For all columns of the specified association to the current object, the reader, writer, and predicate methods are delegated.
Instance Method Details
#delegate_all_for(*attr_names) ⇒ Object
For all columns of the specified association to the current object, the reader, writer, and predicate methods are delegated.
Supported options:
- :except
-
An array of column names to exclude from delegation
- :also_include
-
An array of method names to also delegate
- :prefix
-
Prefixes accessors. See the
delegate
documentation. - :allow_nil
-
Allows accessor to be nil. See the
delegate
documentation.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/delegate_all_for.rb', line 23 def delegate_all_for(*attr_names) return unless self.table_exists? = { except: [], also_include: [], prefix: false, allow_nil: false } .update(attr_names.) .assert_valid_keys(:except, :also_include, :prefix, :allow_nil) exclude_columns = self.column_names.dup.concat([:except].map(&:to_s)) attr_names.each do |association_name| if reflection = reflect_on_association(association_name) to = association_name delegate_opts = .slice(:prefix, :allow_nil).merge(to: to) method_prefix = delegate_opts[:prefix] ? "#{prefix == true ? to : prefix}_" : '' [:also_include].each do |m| class_eval(%{delegate :#{m}, #{delegate_opts}}) end (reflection.klass.column_names - exclude_columns).each do |method| next if method.in?(reflection.foreign_key, 'updated_at', 'updated_on', 'created_at', 'created_on') class_eval <<-eoruby, __FILE__, __LINE__ + 1 delegate :#{method}, #{delegate_opts} delegate :#{method}?, #{delegate_opts} delegate :#{method}=, #{delegate_opts.merge(allow_nil: false)} # allow_nil true leads to unintuitive behavior eoruby end else raise ArgumentError, "No association found for name `#{association_name}'. Has it been defined yet?" end end end |