ruby-on-rails - 为什么 Rails find_or_create_by 块的第一个值在数据库中总是为零?
问题描述
我正在使用一个find_or_create_by
块。
webinar_id
如果没有找到作为参数传递的 TrainingEvent 记录,Rails 应该使用块中传递的所有属性创建一个新的 TrainingEvent。
Rails 创建记录,但第一个属性在数据库中始终为零。
导轨 5.2.0
红宝石 2.4.1p111
TrainingEvent.find_or_create_by(webinar_key: '2345') do |training_event|
training_event.start_date_time = '2018-07-04 12:00:00',
training_event.end_date_time = '2018-07-04 13:00:00',
training_event.published = true,
training_event.hidden_from_list = false,
training_event.training_template_id = 349,
training_event.organizer_key = '6789'
end
start_date_time 不在 SQL 中,最终在数据库中为零。无论哪个属性在块中排在第一位,其值始终为 nil。
解决方案
mu 太短的逗号实际上是导致问题的原因。
这被 Ruby 解释为试图分配一个数组,start_date_time
并在此过程中设置所有其他属性。由于这不是该字段的有效值,因此最终保留为nil
.
看起来这源于一个轻微的误解:
Rails 应该使用块中传递的所有属性创建一个新的 TrainingEvent
该块不是用于传递属性列表。该块是在这种情况下create
传递新模型对象的代码,以便您可以在保存之前对其进行任何操作。去掉逗号,你会没事的!
如果你很好奇,这里有一个更简单的例子来演示你的代码是如何被解释的:
> x = 1, y = 2
这导致x
具有数组值[1, 2]
并y
具有值2