什么是Rails 4替代关联代理?

时间:2015-02-27 06:34:21

标签: ruby-on-rails ruby-on-rails-4 activerecord

我正在将Rails 3.2应用程序升级到Rails 4.2.0。在3.2应用程序中,我使用通用控制器方法将模型对象添加到关联,如下所示:

parentResource.association(associationKey).proxy.push resource

因此,如果我有一个模型Thing和Thing has_many:collection_things,那么parentResource将是Thing的实例,associationKey将是:collection_things。此方法调用将资源(此处为CollectionThing的实例)添加到Thing.collection_things关联中(我本可以使用" send",但这可能允许任何模型方法通过将其作为参数发送来调用)。我不确定这是最好的方法,但它允许我使用单一控制器方法处理许多不同类型的关联。

这在Rails 4中不再有效。看起来,在Rails 4中,我需要获得Thing的

ActiveRecord::Associations::CollectionProxy

并调用push,但调用

parentResource.association(associationKey) 
在我的3.2应用程序中工作的

返回

的实例
ActiveRecord::Associations::HasManyAssociation

不再有代理方法,所以我得到NoM​​ethodError。

有关如何在Rails 4中做到这一点的任何想法?我知道我可以使用像

这样的东西来获取CollectionProxy
parentResource.send association_name

但有没有办法做到这一点,这与我在3.2版本的应用程序中所做的更为相似?

1 个答案:

答案 0 :(得分:0)

好的,经过多次探索,我发现了Rails 4的做法:

t.association(:collection_things).insert_record resource

和删除的工作方式与3.2中的相同:

t.association(:collection_things).delete resource

我已经在pry中测试了它,它似乎按预期工作。