我有协会:
class Foo < ActiveRecord::Base
has_many :bars
end
我想通过保持向后兼容性和有关弃用的信息来更改此关联的名称。如下所示:
class Foo < ActiveRecord::Base
has_many :new_bars, class_name: 'Bar'
# some alias to the old association
# def bars
# # Deprecation warning
# new_bars
# end
如何为关联设置别名,并确保它与更改前的所有ActiveRecord功能兼容。
答案 0 :(得分:0)
我能想到做你需要的唯一方法是:
class Foo < ActiveRecord::Base
has_many :bars
has_many :new_bars, class_name: 'Bar'
# Overwrite legacy association with alias to the new association:
def bars
#If you're using Airbrake:
#Airbrake.notify(Exception.new("Deprecation: bars association called on Foo"))
logger.warn "Deprecation: bars association called on Foo"
new_bars
end
end
您希望需要Active Record反射的操作与两个关联一起使用(例如,join / includes仍然可以工作),因此您需要定义两个关联。但是,您希望显式调用关联以返回相同的内容,因此您还需要别名方法。否则,一个方法可以更新一个关联,然后是另一个读取另一个的方法。然后事情会变得非常奇怪。
我没有对此进行测试,因此请确保在投入生产之前创建一些合理的单元测试。如果你可能,可能,可能,重构整个代码库。在将来的某个时刻,这些黑客会在谚语中咬你。