Я пишу некоторые хитрые полиморфные отношения для обработки меток.
У меня есть a Tag
модель и a Tagging
модель, который belongs_to полиморфное taggable
.
Я имею Item
модель, который has_many :taggings, :as => :taggable
, и has_many :tags, :through => :taggings
, так, чтобы я мог звонить @item.tags
.
Это все работает хорошо.
Я хочу принести другую модель в соединение - a Store
который has_many :items
. Я хочу смочь найти все теги связанными со всеми объектами в использовании хранилища @store.tags
.
Вот то, что я имею:
class Store < AR::Base
has_many :items
has_many :tags, :through => :items, :source => :taggings
Однако это возвращает весь из taggings
связанный с объектами в хранилище, не фактическими тегами.
Как делают я добираюсь, указывают что хранилище has_many теги, через объекты, посредством маркировок?
Может отправить больше информации в случае необходимости - пытающийся предотвратить информационную передозировку! Спасибо :)
Источником для ассоциации has_many
должна быть ассоциация own_to
, has_one
или has_many
без a : через
вариант (спасибо за этот ответ за информацию).
Есть плагин , с которым кое-кто добился успеха, но в моем случае он, похоже, некорректно работал с моей полиморфной ассоциацией taggable
.
На данный момент мое решение - передать параметр finder_sql
в has_many
:
class Store < ActiveRecord::Base
has_many :items
has_many :tags, :finder_sql =>
'SELECT tags.* from tags
INNER JOIN taggings on tags.id = taggings.tag_id
INNER JOIN items on items.id = taggings.taggable_id AND taggings.taggable_type = "Item"
WHERE items.store_id = #{id}'
end
Вы можете сделать это на простом Ruby:
site.wares.map(&:tags).flatten.uniq
Это будет неэффективно, если у вас мало тегов / товаров / предметов.