如果关联保存在字符串中,如何执行build_association?

时间:2015-07-18 14:13:32

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

在Rails has_one关系中,如果关联名称存储在字符串中,如何构建名称以字符串形式保存的子对象?

例如,customer has_one address

class Customer < ActiveRecord::Base
   has_one :address
end

我们可以这样做:

customer = Customer.new
address = customer.build_address

如果关联保存在变量名称@association中,我们如何使用变量address创建@association?:

@association = 'address'
customer = Customer.new
address = customer.build_{@association}  #code does not work.

我们尝试了customer.build_"#{@association}" & 'customer.build_#{@association},但没有一个有效。

1 个答案:

答案 0 :(得分:1)

您想要进行元编程,即在此处调用名称包含在变量中的方法。

您需要使用的Ruby方法是发送:

customer.send("build_#{association_name}")

您只能在双引号字符串中使用#{...}语法".."或正则表达式/../

请注意,send也适用于符号,您可以在第一个之后提供参数。请记住,=, [], !, ?也是方法名称的一部分。

method= 'name=', 
new_name= "hello"
@your_object.send(method, new_name)