0

Модель User, которая имеет множество Contact. Post s и Image s могут быть опубликованы до Contact с по ContactPublishment.несколько has_many-through в одну и ту же полиморфную таблицу, но с разным исходным классом, не работают в тестах, но работают в действительности

User имеет методы visible_posts и visible_images, чтобы обеспечить легкий доступ к Post с и Image с опубликованными в.

Проблема заключается в том, что в то время как user.visible_images и user.visible_posts работы отлично, функции, которые полагаются на эти отношения сходят с ума:

Если удаление либо тест на visible_images или visible_posts из спецификации, остальные тесты проходят. если я оставлю оба, второй не удастся. Я могу переключить порядок тестов, но 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 

ответ

0

Так что я решил его в конце концов, но не так, как я хотел. Я просто написал ручной запрос соединения. Самое смешное в том, что это вызывает тот же самый точный SQL-запрос, что и мое первоначальное решение, но почему-то только это передает спецификации. Ошибка в Rails?

class User < ActiveRecord::Base 
    ... 
    [Post, Image].each do |publishable| 
    define_method("visible_#{publishable.name.pluralize.underscore}") do 
     publishable.joins(:users).where('users.id' => self.id) 
    end 
    end 
end