1

楷模:

class Person < ActiveRecord::Base
  attr_accessible :email, :first, :last, :uuid, :books
  has_many :books
end

class Book < ActiveRecord::Base
  belongs_to :person
  attr_accessor :blurb, :published, :title, :person
  attr_accessible :person
end

Person使用Rails 3.2.8 控制台创建了一个这样的:

person = Person.create!( {:first => "John", :last => "Doe"} )

然后创建了一个Book

book = Book.create!( {:title => "Ruby for Dummies"} )

然后我尝试像这样关联它们:

person.books << book

当我向这个人查询书籍时,我得到了一个包含我创建的书籍的数组,但是当我查询这本书的所属人时,我得到了 nil。鉴于所有信息都已持久化,我希望能找到此人(我看到 SQL 命令并检查了数据库并且数据是正确的,即 book 表中的行指向它应该返回的人员 ID。)

我错过了什么?

谢谢

编辑模式:

CREATE TABLE `persons` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `first` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `last` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `uuid` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `email` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `created_at` DATETIME NOT NULL,
    `updated_at` DATETIME NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2;

CREATE TABLE `books` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `title` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `blurb` TEXT NULL COLLATE 'utf8_unicode_ci',
    `published` TINYINT(1) NULL DEFAULT NULL,
    `person_id` INT(11) NULL DEFAULT NULL,
    `created_at` DATETIME NOT NULL,
    `updated_at` DATETIME NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3;
4

2 回答 2

2

假设您的迁移是正确的,那么您的代码没有任何问题,应该会产生以下结果:

1.9.3p194 :001 > person = Person.create!( {:first => "John", :last => "Doe"} )
   (0.1ms)  begin transaction
  SQL (145.9ms)  INSERT INTO "people" ("book_id", "created_at", "email", "first", "last", "updated_at", "uuid") VALUES (?, ?, ?, ?, ?, ?, ?)  [["book_id", nil], ["created_at", Mon, 03 Sep 2012 21:35:53 UTC +00:00], ["email", nil], ["first", "John"], ["last", "Doe"], ["updated_at", Mon, 03 Sep 2012 21:35:53 UTC +00:00], ["uuid", nil]]
   (43.5ms)  commit transaction
 => #<Person id: 1, email: nil, first: "John", last: "Doe", uuid: nil, book_id: nil, created_at: "2012-09-03 21:35:53", updated_at: "2012-09-03 21:35:53"> 
1.9.3p194 :005 > book = Book.create!( {:title => "Ruby for Dummies"} )
   (0.1ms)  begin transaction
  SQL (1.4ms)  INSERT INTO "books" ("blurb", "created_at", "person_id", "published", "title", "updated_at") VALUES (?, ?, ?, ?, ?, ?)  [["blurb", nil], ["created_at", Mon, 03 Sep 2012 21:36:25 UTC +00:00], ["person_id", nil], ["published", nil], ["title", nil], ["updated_at", Mon, 03 Sep 2012 21:36:25 UTC +00:00]]
   (4.4ms)  commit transaction
 => #<Book id: 1, blurb: nil, published: nil, title: nil, person_id: nil, created_at: "2012-09-03 21:36:25", updated_at: "2012-09-03 21:36:25"> 
1.9.3p194 :006 > person.books << book
   (0.1ms)  begin transaction
   (0.3ms)  UPDATE "books" SET "person_id" = 1, "updated_at" = '2012-09-03 21:36:39.566387' WHERE "books"."id" = 1
   (4.4ms)  commit transaction
  Book Load (0.3ms)  SELECT "books".* FROM "books" WHERE "books"."person_id" = 1
 => [#<Book id: 1, blurb: nil, published: nil, title: nil, person_id: 1, created_at: "2012-09-03 21:36:25", updated_at: "2012-09-03 21:36:39">] 
1.9.3p194 :007 > Book.all
  Book Load (0.5ms)  SELECT "books".* FROM "books" 
 => [#<Book id: 1, blurb: nil, published: nil, title: nil, person_id: 1, created_at: "2012-09-03 21:36:25", updated_at: "2012-09-03 21:36:39">] 

问题出在您的 Book 模型上,请尝试以下操作:

class Book < ActiveRecord::Base
  attr_accessible :person, :title, :person

  belongs_to :person
end

之前

1.9.3p194 :002 > Book.last
  Book Load (0.1ms)  SELECT "books".* FROM "books" ORDER BY "books"."id" DESC LIMIT 1
 => #<Book id: 4, blurb: nil, published: nil, title: nil, person_id: 1, created_at: "2012-09-03 21:55:33", updated_at: "2012-09-03 21:55:33"> 
1.9.3p194 :003 > Book.last.person
  Book Load (0.2ms)  SELECT "books".* FROM "books" ORDER BY "books"."id" DESC LIMIT 1
 => nil 

之后

1.9.3p194 :001 > Book.last
  Book Load (0.4ms)  SELECT "books".* FROM "books" ORDER BY "books"."id" DESC LIMIT 1
 => #<Book id: 4, blurb: nil, published: nil, title: nil, person_id: 1, created_at: "2012-09-03 21:55:33", updated_at: "2012-09-03 21:55:33"> 
1.9.3p194 :002 > Book.last.person
  Book Load (1.0ms)  SELECT "books".* FROM "books" ORDER BY "books"."id" DESC LIMIT 1
  Person Load (0.1ms)  SELECT "people".* FROM "people" WHERE "people"."id" = 1 LIMIT 1
 => #<Person id: 1, email: nil, first: "John", last: "Doe", uuid: nil, created_at: "2012-09-03 21:48:02", updated_at: "2012-09-03 21:48:02"> 
于 2012-09-03T21:40:40.860 回答
0

您是否尝试过执行以下操作?如果是这样, book.person 会给你什么?

person = Person.create!( {:first => "John", :last => "Doe"} )
book = Book.create!( {:title => "Ruby for Dummies"} )
book.person_id = person.id


person.books 
book.person
于 2012-09-03T21:08:57.450 回答