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

次のようにRails 3.2.8コンソールPersonを使用して作成しました:

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 に答える