モデルは でUser
、多くContact
の があります。Post
およびは、 を介してImage
に発行できます 。Contact
ContactPublishment
User
には、公開されたおよびに簡単にアクセスできるようにするメソッドvisible_posts
およびがあります。visible_images
Post
Image
問題は、 と が完全に機能する一方user.visible_images
でuser.visible_posts
、これらの関係に依存する仕様が狂ってしまうことです。
visible_images
仕様のテストまたは仕様からのテストのいずれかを削除するvisible_posts
と、残りのテストはパスします。両方を残すと、2 つ目は失敗します。テストの順序を切り替えることはできますが、それでも 2 番目のテストは失敗します。変でしょ?
これは、Rails 3.2.15 を使用したコード サンプルです。
class User < ActiveRecord::Base
...
has_many :visible_posts, through: :contact_publishments, source: :publishable, source_type: 'Post'
has_many :visible_images, through: :contact_publishments, source: :publishable, source_type: 'Image'
end
class Contact < ActiveRecord::Base
...
belongs_to :represented_user, class_name: User.name
has_many :contact_publishments
end
class ContactPublishment < ActiveRecord::Base
...
belongs_to :contact
belongs_to :publishable, polymorphic: true
end
class Post < ActiveRecord::Base
...
has_many :contact_publishments, as: :publishable, dependent: :destroy
has_many :contacts, through: :contact_publishments
end
class Image < ActiveRecord::Base
...
has_many :contact_publishments, as: :publishable, dependent: :destroy
has_many :contacts, through: :contact_publishments
end
describe User do
...
it "#visible_images" do
user = create :user
image = create :image
image.contacts << create(:contact, represented_user: user)
user.visible_images.should == [image]
end
it "#visible_posts" do
user = create :user
post = create :post
post.contacts << create(:contact, represented_user: user)
user.visible_posts.should == [post]
end
end