Rails:ActiveRecord和send; 如何只知道类名来设置activerecord实例的关系?

Zan*_*ndo 5 ruby activerecord metaprogramming ruby-on-rails

所以我正在迭代我所有的AR并动态设置它们的关系...所以我知道我有SomeObject并且它属于ManyObjects ...我想做这样的事情:

an_object.some_relation = related_object
an_object.save
Run Code Online (Sandbox Code Playgroud)

有没有办法通过发送或类似的方法来做到这一点?这当然不起作用:

an_object.send(some_relation_name, related_object)
Run Code Online (Sandbox Code Playgroud)

这是有效的,我只是想做一个不那么危险,更多Rails-meta方式:

an_object.update_attributes({"#{some_relation_name}_id"=>related_object.id})
Run Code Online (Sandbox Code Playgroud)

jes*_*iss 15

那么你可以做到

an_object.send("#{some_relation_name}=", related_object)
Run Code Online (Sandbox Code Playgroud)

这只是动态调用setter方法.

或者你可以降低一点并使用:

an_object.reflect_on_association(some_relation_name).build_association(related_object_attributes)
Run Code Online (Sandbox Code Playgroud)

我会选择第一个,有时使用send有点"可怕",但这就是ruby的全部,动态编程.