我有联想:
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 功能兼容。
最佳答案
我能想到的唯一方法就是:
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 反射的操作与两个关联一起工作(例如,连接/包含仍然可以工作),因此您需要定义两个关联。但是,您希望显式调用任一关联返回相同的内容,因此您还需要别名方法。否则,一种方法可以更新一个关联,然后另一种方法读取另一个关联。然后事情会变得非常奇怪。
我还没有对此进行测试,因此请确保在将其投入生产之前创建一些合理的单元测试。如果你可能,可能,可能,重构整个代码库。众所周知,这些类型的 hack 会在未来的某个时候咬你一口。
关于ruby-on-rails - 别名 ActiveRecord 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25422957/