Rails 4:find_or_initialize_by 和条件默认值

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。我怎么能在那个循环中写呢?

Sha*_*med 5

如果你研究了 的实现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)