1

別のモデルとhas_one関連付けられたモデルがありthroughます。

class Publisher
  has_many :books
end

class Book
  belongs_to :publisher
  has_one :author
end

class Author
  belongs_to :book
  has_one :publisher, :through => :book
end

私の Rails コードではauthor.publisher、問題なく呼び出すことができるので、すべてがうまく機能します。ただし、私の仕様では (Rspec と FactoryGirl を使用すると、関連付けがうまくいかないようです。私の FactoryGirl の定義は次のとおりです。

Factory.define :author do |a|
  a.association :book
end

Factory.define :book do |b|
  b.association :publisher
end

Factory.define :publisher
end

(ファクトリのほとんどの属性は省略されています)。

私の仕様では、次のことができます

pub = Factory(:publisher)
book = Factory(:book, :publisher => pub)
author = Factory(:author, :book => book)

author.book # => Returns book
author.book.publisher # => Returns publisher 
author.publisher # => nil

では、なぜ私のthrough関連付けが機能しないのでしょうか。

4

1 に答える 1

2

factory_girl/ 4.1.0ではfactory_girl_rails、次のように動作します。

factories.rb

FactoryGirl.define do

  factory :author do
    book
  end

  factory :book do
    publisher
  end

  factory :publisher do
  end

end

レールコンソールで:

pub = FactoryGirl.create(:publisher)
#=> #<Publisher id: 1, created_at: "2013-01-30 13:35:26", updated_at: "2013-01-30 13:35:26">
book = FactoryGirl.create(:book, :publisher => pub)
#=> #<Book id: 1, publisher_id: 1, created_at: "2013-01-30 13:36:23", updated_at: "2013-01-30 13:36:23">
author = FactoryGirl.create(:author, :book => book)
#=> #<Author id: 1, book_id: 1, created_at: "2013-01-30 13:36:57", updated_at: "2013-01-30 13:36:57">
author.book
#=> #<Book id: 1, publisher_id: 1, created_at: "2013-01-30 13:36:23", updated_at: "2013-01-30 13:36:23">
author.book.publisher
#=> #<Publisher id: 1, created_at: "2013-01-30 13:35:26", updated_at: "2013-01-30 13:35:26">
author.publisher
#=> #<Publisher id: 1, created_at: "2013-01-30 13:35:26", updated_at: "2013-01-30 13:35:26">

不思議なことに、最後author.publisherには追加の SELECT 操作が必要ですが、そうではありauthor.book.publisherません (おそらくnilあなたが観察したことに関連しています):

Publisher Load (0.2ms)  SELECT "publishers".* FROM "publishers"
  INNER JOIN "books" ON "publishers"."id" = "books"."publisher_id"
  WHERE "books"."id" = 1 LIMIT 1

の代わりにPublisher.create,を使用しても同じことが起こります。これは factory girl の動作ではなく、レールの動作であり、関連付けがキャッシュされる方法と関係があります。Book.createAuthor.createFactoryGirl.createthrough

于 2013-01-30T13:43:01.127 に答える