oka*_*56k 1 ruby ruby-on-rails ruby-on-rails-4
我有一个类可以建立这样的关系:
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
Run Code Online (Sandbox Code Playgroud)
这样如果它已经存在就会被发现,或者如果它不存在就会被构建。我的问题是text: master.default_value
. 我想仅在我们建立新关系时才设置它,而不是在find_or_initialize_by
. 类似的东西text: text || master.default_value
。我怎么能在那个循环中写呢?
如果你研究了 的实现
find_or_initialize_by
,
def find_or_initialize_by(attributes, &block)
find_by(attributes) || new(attributes, &block)
end
Run Code Online (Sandbox Code Playgroud)
你会看到它期望attributes
以及block
. 属性仅用于查找记录。因此,您可以block
在新对象的实例化过程中通过 a来初始化默认属性。
因此,要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
Run Code Online (Sandbox Code Playgroud)