3

У меня есть таблица Category, которая может иметь много Businesses и Posts. И Business/Post может иметь много Categories, поэтому я создал полиморфный текст, называемый CategoryRelationship, чтобы разбить многие на многие отношения.Rails HABTM с полиморфными отношениями

Business модель имеет следующие соотношения:

has_many :categories, through: :category_relationships, :source => :category_relationshipable, :source_type => 'Business' 
    has_many :category_relationships 

CategoryRelationship модель имеет следующие соотношения:

attr_accessible :category_id, :category_relationship_id, :category_relationship_type 

    belongs_to :category_relationshipable, polymorphic: true 
    belongs_to :business 
    belongs_to :post 
    belongs_to :category 

Category имеет следующие соотношения:

has_many :category_relationships 
    has_many :businesses, through: :category_relationships 
    has_many :posts, through: :category_relationships 

Post будет иметь аналогичные отношений Типы onships как Business.

Так что теперь, когда я бегу Business.first.categories я получаю ошибку:

Business Load (6.1ms) SELECT "businesses".* FROM "businesses" LIMIT 1 
    Business Load (2.5ms) SELECT "businesses".* FROM "businesses" INNER JOIN "category_relationships" ON "businesses"."id" = "category_relationships"."category_relationshipable_id" WHERE "category_relationships"."business_id" = 3 AND "category_relationships"."category_relationshipable_type" = 'Business' 
ActiveRecord::StatementInvalid: PG::Error: ERROR: column category_relationships.business_id does not exist 
LINE 1: ...lationships"."category_relationshipable_id" WHERE "category_... 
                  ^
: SELECT "businesses".* FROM "businesses" INNER JOIN "category_relationships" ON "businesses"."id" = "category_relationships"."category_relationshipable_id" WHERE "category_relationships"."business_id" = 3 AND "category_relationships"."category_relationshipable_type" = 'Business' 

Как структурировать отношения так это работает?

+0

Возможный дубликат [ActiveRecord, имеет \ _many: через и полиморфных ассоциаций] (http://stackoverflow.com/questions/1683265/activerecord-has-many-through-and-polymorphic-associations) – sbonami

ответ

9

Похожие вопросы здесь: Rails polymorphic has_many :through И здесь: ActiveRecord, has_many :through, and Polymorphic Associations

Я думаю, что это должно быть что-то вроде этого:

class Category 
    has_many :categorizations 
    has_many :businesses, through: :categorizations, source: :categorizable, source_type: 'Business' 
    has_many :posts, through: :categorizations, source: :categorizable, source_type: 'Post' 
end 

class Categorization 
    belongs_to :category 
    belongs_to :categorizable, polymorphic: true 
end 

class Business #Post looks the same 
    has_many :categorizations, as: :categorizeable 
    has_many :categories, through: :categorizations 
end 
+0

просто любопытно ... зачем нам нужно «has_many: предприятия, через:: категоризации .... "и" has_many: сообщения, через:: категоризации ... "в модели категории? Почему мы не можем иметь «has_many: категоризации»? –

+0

@RavJohal Я не тестировал это, но мои мысли состоят в том, что на самом деле вам не нужны две последние строки 'has_many' в классе Category, но вы, вероятно, захотите их. Все эти две последние строки работают так, как я понимаю, это создать вспомогательные методы класса Category и позволить вам делать такие вещи, как: @ category.businesses или, возможно, '@ category.posts.where (опубликовано: true)' и т. Д. Без двух последних операторов has_many у вас не было бы этих вспомогательных методов и вам нужно было бы сделать что-то вроде этого: '@ category.categorizations.where (categorizable_type: 'Post') ......', в основном намного сложнее .. – FireDragon