Rails 4:find_or_initialize_by和条件默认值

时间:2015-03-30 21:14:21

标签: ruby-on-rails ruby 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

如果它已经存在或者如果它不存在则会被发现。我的问题在于text: master.default_value。我想在我们为find_or_initialize_by找到的关系建立新关系而时设置该关系。像text: text || master.default_value这样的东西。我怎么能在那个循环中写出来?

1 个答案:

答案 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