ruby-on-rails - 别名 ActiveRecord 关联

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

最佳答案

我能想到的唯一方法就是:

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/

相关文章:

mysql - 使用 codeigniter 的事件记录模式的 UNION 查询

sql - 使用 Date.today 加入命名范围的一部分

ruby-on-rails - 在 STI 表中使用太阳黑子 gem

ruby-on-rails - 获取将从某个方法或named_scope执行的SQL

ruby-on-rails - 用整数写一个 Rails 验证器

ruby-on-rails - 如何验证 Rails 中的重叠时间

ruby-on-rails - Rails 3. 如何对所有记录执行保存操作?

javascript - Rails 3 中的 jquery/javascript

ruby-on-rails - 创建一个辅助方法以从 rails 中的 url 开头删除 http 或 https

ruby - 确保类的单个实例的正确方法是什么?