将行插入表中的Rails未成功发生

时间:2017-07-29 10:24:45

标签: ruby-on-rails mysqli

我正在尝试添加到timmings表中,但记录Timming.where(:in => in)没有获得其他值,因为它按预期存储它会t.in返回nil有人请告诉我为什么会这样。

这是我的表格架构:

create_table "timmings", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
  t.string "in"
  t.integer "bus_type"
  t.bigint "provider_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.integer "route_id"
  t.index ["provider_id"], name: "index_timmings_on_provider_id"
end

Rails控制台:

t = Timming.new
=> #<Timming:0x00558be5e2c108 id: nil, in: nil, bus_type: nil, provider_id: nil, created_at: nil, updated_at: nil, route_id: nil>

[250] pry(main)> t.in = Time.now.to_s
[251] pry(main)> t.provider_id = 1
=> 1
[252] pry(main)> t.route_id = 1
=> 1
[253] pry(main)> t.save
(0.4ms)  SAVEPOINT active_record_1
Provider Load (0.6ms)  SELECT  `providers`.* FROM `providers` WHERE `providers`.`id` = 1 LIMIT 1
Route Load (0.5ms)  SELECT  `routes`.* FROM `routes` WHERE `routes`.`id` = 1 LIMIT 1
SQL (0.6ms)  INSERT INTO `timmings` (`provider_id`, `created_at`, `updated_at`, `route_id`) VALUES (1, '2017-07-29 08:06:46', '2017-07-29 08:06:46', 1)
(0.3ms)  RELEASE SAVEPOINT active_record_1
=> true

现在我打印t

id: 18,
in: nil,
bus_type: nil,
provider_id: 1,
created_at: Sat, 29 Jul 2017 08:06:46 UTC +00:00,
updated_at: Sat, 29 Jul 2017 08:06:46 UTC +00:00,
route_id: 1>

谁能告诉我这里出了什么问题?

1 个答案:

答案 0 :(得分:1)

<强>更新

正如您所提到的那样,您使用了同名的attr_accessor,那么它首先是什么? attr_accessor用于定义Model对象的属性,该属性未与数据库中的任何列进行映射。 attr_accessor创建了两个方法,即getter方法和setter方法。所以在你的情况下,Rails定义了这些:

# getter
def in
  @in
end

# setter
def in=(val)
  @in = val
end

因此,只要您t.in = Time.now.to_s,就会将其分配给@in,而不是保存在数据库中。这就是为什么你无法将值保存在数据库中的原因。

上一个答案(没有帮助OP):

您的列名为in,这是MySQL中的保留关键字,因此将列重命名为其他内容然后尝试它,它应该可以正常工作。

来源: MySQL Reserved Keywords