belongs_to / has_many在Rails控制台中的行为不符合预期

时间:2012-09-03 20:54:13

标签: ruby-on-rails-3 activerecord one-to-many

模型:

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

我使用 Rails 3.2.8控制台创建了Person,如下所示:

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

然后创建了Book

book = Book.create!( {:title => "Ruby for Dummies"} )
然后我尝试将它们关联起来:

person.books << book

当我向这个人查询书籍时,我得到了一个包含我创建的书的数组,但是当我查询该书所属的人时,我得到了零。我希望得到这个人,因为所有信息都是持久的(我看到SQL命令,我检查了数据库,数据是正确的,即书表中的行指向它应该的人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;

2 个答案:

答案 0 :(得分: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"> 

答案 1 :(得分: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