Ruby on rails 扩展ActiveRecord别名以按方法查找
在Ruby on rails 扩展ActiveRecord别名以按方法查找,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,在ActiveRecord::Base子类中,我想为字段添加别名,因为在新类中有一个同名的等效字段。例如,我做了如下事情: class OldClass < ActiveRecord::Base alias_attribute :new_style_id, :id end class NewClass < ActiveRecord::Base ; end classoldclass
ActiveRecord::Base
子类中,我想为字段添加别名,因为在新类中有一个同名的等效字段。例如,我做了如下事情:
class OldClass < ActiveRecord::Base
alias_attribute :new_style_id, :id
end
class NewClass < ActiveRecord::Base ; end
classoldclass
new\u-style\u-id
是NewClass
上的一个字段,有一个类似于find\u by\u-new\u-style\u-id
的查找器,但是alias\u属性
不会为OldClass
创建类似的查找,因此尝试调用find\u by\u by\u-new\u-style\u-id
会在调用OldClass>时引发未定义的方法异常。除了简单地将find\u by\u new\u style\u id
添加到OldClass
之外,还有没有一种方法可以让Rails自动生成别名的查找器,以便OldClass
和NewClass
都响应find\u by\u new\u style\u id
?您需要的是一个范围:
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
虽然这是一个解决方案,但我不确定它是否真的比我现在所做的更好,我现在所做的只是实现find_by_new_style_id
像def find_by_new_style_id(id));通过_id(id)查找_;在OldClass
上结束
。您可以看看这篇文章: