别名ActiveRecord关联

时间:2014-08-21 09:36:42

标签: ruby-on-rails ruby activerecord

我有协会:

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功能兼容。

1 个答案:

答案 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仍然可以工作),因此您需要定义两个关联。但是,您希望显式调用关联以返回相同的内容,因此您还需要别名方法。否则,一个方法可以更新一个关联,然后是另一个读取另一个的方法。然后事情会变得非常奇怪。

我没有对此进行测试,因此请确保在投入生产之前创建一些合理的单元测试。如果你可能,可能,可能,重构整个代码库。在将来的某个时刻,这些黑客会在谚语中咬你。

相关问题