将ActiveRecord别名扩展为find_by_方法

时间:2014-08-12 22:46:20

标签: ruby-on-rails ruby activerecord

ActiveRecord::Base子类中,我想为一个字段设置别名,因为在新类中有一个具有不同名称的等效字段。例如,我做了类似的事情:

class OldClass < ActiveRecord::Base
  alias_attribute :new_style_id, :id
end
class NewClass < ActiveRecord::Base ; end

new_style_id,作为NewClass上的字段,有一个类似find_by_new_style_id的查找器,但alias_attribute没有为OldClass创建类似的结果,因此在find_by_new_style_id上调用时,尝试调用OldClass会引发未定义的方法异常。如果只是将find_by_new_style_id添加到OldClass,是否可以让Rails自动为别名生成查找程序,以便OldClassNewClass都能响应{{1} }}?

1 个答案:

答案 0 :(得分:1)

您需要的是范围:

scope : find_by_new_style_id, -> (new_style_id){ where( 'style_id=?', new_style_id ) }

如果您需要在多个课程中使用它,您可以使用一个问题。

module StyleScope
  extend ActiveSupport::Concern
  included do
    scope : find_by_new_style_id, -> (new_style_id){ where( 'style_id=?', new_style_id ) }
  end
end

在你的模特中:

ìnclude StyleScope

http://api.rubyonrails.org/classes/ActiveSupport/Concern.html http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-scope