我正在尝试添加到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>
谁能告诉我这里出了什么问题?
答案 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中的保留关键字,因此将列重命名为其他内容然后尝试它,它应该可以正常工作。