首页 > 解决方案 > 为什么 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。

在此处输入图像描述

标签: ruby-on-railsrubyactiverecord

解决方案


mu 太短的逗号实际上是导致问题的原因。

这被 Ruby 解释为试图分配一个数组,start_date_time并在此过程中设置所有其他属性。由于这不是该字段的有效值,因此最终保留为nil.

看起来这源于一个轻微的误解:

Rails 应该使用块中传递的所有属性创建一个新的 TrainingEvent

该块不是用于传递属性列表。该块是在这种情况下create传递新模型对象的代码,以便您可以在保存之前对其进行任何操作。去掉逗号,你会没事的!


如果你很好奇,这里有一个更简单的例子来演示你的代码是如何被解释的:

> x = 1, y = 2

这导致x具有数组值[1, 2]y具有值2


推荐阅读