【发布时间】:2014-05-01 13:36:49
【问题描述】:
我有一个相当简单的有很多/属于关系模型:报告有很多记录有很多相关发布者。所属对象有一个外键来标识它们的父对象。
但是,我无法保存任何“相关发布者”。或者更确切地说,我“可以”,提交事务返回 true,但未创建相关记录,相应的 SQLite3 命令没有意义。
为什么 Rails 生成的 SQLite 动作是创建空 Record 的命令?为什么要绕过相关发布者的保存?
在rails console,部分输出被截断
> @report = Report.new => #<Report id: nil, ... >
> @record = @report.records.build(leid: 1234567890) => #<Record id: nil, leid: 1234567890, ...>
> @related_publisher = @record.related_publishers.build(sid: 9876)
=> #<RelatedPublisher id: nil, ..., sid: 9876, ...>
> @report.save
(0.1ms) begin transaction
SQL (4.5ms) INSERT INTO "reports" ("created_at", "updated_at") VALUES (?, ?) [["created_at", Wed, 07 May 2014 11:20:50 UTC +00:00], ["updated_at", Wed, 07 May 2014 11:20:50 UTC +00:00]]
SQL (0.2ms) INSERT INTO "records" ("created_at", "leid", "report_id", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Wed, 07 May 2014 11:20:50 UTC +00:00], ["leid", 1234567890], ["report_id", 22], ["updated_at", Wed, 07 May 2014 11:20:50 UTC +00:00]]
SQL (0.3ms) INSERT INTO "records" ("created_at", "updated_at") VALUES (?, ?) [["created_at", Wed, 07 May 2014 11:20:50 UTC +00:00], ["updated_at", Wed, 07 May 2014 11:20:50 UTC +00:00]]
(0.7ms) commit transaction
=> true
> RelatedPublisher.all
RelatedPublisher Load (0.3ms) SELECT "related_publishers".* FROM "related_publishers"
=> #<ActiveRecord::Relation []>
(在 Mac OSX 10.9.2 上使用 Rails 4.0.4 和 sqlite3 3.7.13 以及 gem 版本 1.3.9 和 Ruby 2.0.0p353
app/models/report.rb
class Report < ActiveRecord::Base
has_many :records
end
app/models/record.rb
class Record < ActiveRecord::Base
belongs_to :report
has_many :related_publishers
end
app/models/related_publisher.rb
class RelatedPublisher < ActiveRecord::Base
belongs_to :record
end
来自schema.rb
create_table "records", force: true do |t|
t.integer "leid"
t.integer "sid"
t.string "name"
t.string "url"
t.string "join_date"
t.string "join_ip"
t.string "country"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "report_id"
t.boolean "ipAddressMatch"
t.boolean "whoisAddressMatch"
t.integer "recommendation"
end
add_index "records", ["report_id"], name: "index_records_on_report_id"
create_table "related_publishers", force: true do |t|
t.integer "leid"
t.integer "sid"
t.string "name"
t.string "url"
t.string "join_date"
t.string "join_ip"
t.string "country"
t.integer "record_id"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "related_publishers", ["record_id"], name: "index_related_publishers_on_record_id"
create_table "reports", force: true do |t|
t.integer "report_type"
t.string "upload_data_file_path"
t.string "completed_data_file_path"
t.datetime "created_at"
t.datetime "updated_at"
t.string "ltn_username"
end
【问题讨论】:
-
你做了
x = @record.related_records.new,这将创建一个新的空白对象。然后你x.save,它保存了空白对象。 -
谢谢,@JustinWood 你是对的:那是构建对象的错误方法。不幸的是,问题仍然存在——请查看已编辑的问题。
标签: ruby-on-rails ruby activerecord ruby-on-rails-4 sqlite