我有一个建立如此关系的课程:
def assign_vars
template_variables.each do |master|
@document.template_variables.find_or_initialize_by(
name: master.name, tag: master.tag, text: master.default_value)
end
end
end
如果它已经存在或者如果它不存在则会被发现。我的问题在于text: master.default_value
。我想在我们为find_or_initialize_by
找到的关系建立新关系而不时设置该关系。像text: text || master.default_value
这样的东西。我怎么能在那个循环中写出来?
答案 0 :(得分:4)
如果您研究
find_or_initialize_by
的实施,
def find_or_initialize_by(attributes, &block)
find_by(attributes) || new(attributes, &block)
end
您会看到它需要attributes
以及block
。属性仅用于查找记录。因此,您可以在实例化新对象期间传递block
来初始化默认属性。
因此,要仅在未找到记录时设置默认text
值,您可以尝试:
def assign_vars
template_variables.each do |master|
@document.template_variables.find_or_initialize_by(
name: master.name, tag: master.tag) do |t|
t.text = master.default_value
end
end
end
end