【发布时间】:2014-08-03 02:32:07
【问题描述】:
问题
Rails 控制台不会将我的记录保存到数据库中,如果它具有belongs_to 关联。
2.1.1 :002 > Track.create name: 'asdfasdf'
(0.1ms) begin transaction
SQL (0.6ms) INSERT INTO "records" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2014-06-12 15:58:20.868095"], ["updated_at", "2014-06-12 15:58:20.868095"]]
(45.9ms) commit transaction
=> #<Track id: nil, record_id: 1, name: "asdfasdf", created_at: nil, updated_at: nil>
class Record < ActiveRecord::Base
has_many :tracks
accepts_nested_attributes_for :tracks, allow_destroy: true
end
class Track < ActiveRecord::Base
belongs_to :record
end
class CreateRecords < ActiveRecord::Migration
def change
create_table :records do |t|
t.string :title
t.timestamps
end
end
end
class CreateTracks < ActiveRecord::Migration
def change
create_table :tracks do |t|
t.belongs_to :record
t.string :name
t.timestamps
end
end
end
如您所见, :id 字段为零。 :record_id 字段改为递增。 我已经尝试重置主键,但问题仍然存在。然而,这不是我的主要问题,因为插入后甚至没有保存记录。
2.1.1 :003 > Track.last
Track Load (0.3ms) SELECT "tracks".* FROM "tracks" ORDER BY "tracks"."id" DESC LIMIT 1
=> nil
这是一个问题,因为它阻止我使用像 this one 这样的嵌套表单。当我下载并运行that rails 应用程序时,它运行良好。
2.1.1 :002 > Answer.create content: 'swwaaagggggs'
(0.2ms) begin transaction
SQL (0.8ms) INSERT INTO "answers" ("content", "created_at", "updated_at") VALUES (?, ?, ?) [["content", "swwaaagggggs"], ["created_at", "2014-06-12 16:46:04.989529"], ["updated_at", "2014-06-12 16:46:04.989529"]]
(58.9ms) commit transaction
=> #<Answer id: 3, question_id: nil, content: "swwaaagggggs", created_at: "2014-06-12 16:46:04", updated_at: "2014-06-12 16:46:04">
然而,当我完全自己重新创建它时,我遇到了同样的问题。
奇怪
如果我回滚迁移并删除关联,我会得到这个。
2.1.1 :003 > Track.create name: 'swagger'
(0.2ms) begin transaction
SQL (0.7ms) INSERT INTO "records" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2014-06-12 16:06:12.443845"], ["updated_at", "2014-06-12 16:06:12.443845"]]
(0.2ms) rollback transaction
ActiveModel::MissingAttributeError: can't write unknown attribute `record_id'
class Record < ActiveRecord::Base
end
class Track < ActiveRecord::Base
end
class CreateRecords < ActiveRecord::Migration
def change
create_table :records do |t|
t.string :title
t.timestamps
end
end
end
class CreateTracks < ActiveRecord::Migration
def change
create_table :tracks do |t|
t.string :name
t.timestamps
end
end
end
当列不再存在时,请注意对 :record_id 的引用
我很茫然。
Google 页面已用完,但似乎没有其他人遇到此问题,这导致我认为过去 2 天我的代码有问题; “这种有据可查的东西不应该这么难,”我想。如果有人能帮我解决这个问题,我将不胜感激。
如果您需要更多信息,请告诉我这是我第一次觉得有必要在 StackOverflow 上发帖。
【问题讨论】:
-
您是否尝试在迁移中简单地使用 t.integer :record_id 而不是 t.belongs_to :record ?
-
这是这个的输出。 StandardError:发生错误,此迁移和所有后续迁移已取消:您无法重新定义主键列“id”。
标签: ruby-on-rails rails-activerecord rails-console