module ActiveRecord::Base
Adds the metafy method in ActiveRecord::Base
, which can be used to define the metafied objects.
Public Class Methods
metafied?()
click to toggle source
# File lib/metafy/activerecord_methods.rb, line 5 def metafied? @metafied || false end
metafy( *options )
click to toggle source
# File lib/metafy/activerecord_methods.rb, line 9 def metafy( *options ) cattr_accessor :metafied_attrs self.metafied_attrs = options # Sets to determine what classes have been metafied @metafied = self.metafied_attrs.count > 0 meta_joins = [] class_name = self.name.classify table_name = self.table_name meta_selects = ["#{table_name}.*"] self.metafied_attrs.each do |col| meta_joins.push("LEFT JOIN mattrs m_#{col.to_s} ON m_#{col.to_s}.target_id=#{table_name}.id AND m_#{col.to_s}.meta_key='#{col.to_s}' AND m_#{col.to_s}.target_type='#{class_name}'") meta_selects.push("m_#{col.to_s}.meta_value AS #{col.to_s}") end default_scope :select => meta_selects, :joins => meta_joins scope :meta_where, lambda { |options| conditions = {} options.each_pair do |key,val| conditions["m_#{key.to_s}".to_sym] = { :meta_value => val } end where(conditions) } has_many :mattr, :as => :target options.each do | meta_attr | attr_accessor meta_attr.to_sym end include Metafy::Base end