Как я указываю ассоциации в направляющих, которые проходят через несколько моделей

Я пишу некоторые хитрые полиморфные отношения для обработки меток.

У меня есть 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 теги, через объекты, посредством маркировок?

Может отправить больше информации в случае необходимости - пытающийся предотвратить информационную передозировку! Спасибо :)

1
задан nfm 4 August 2010 в 01:00
поделиться

2 ответа

Источником для ассоциации 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
2
ответ дан 2 September 2019 в 22:32
поделиться

Вы можете сделать это на простом Ruby:

site.wares.map(&:tags).flatten.uniq

Это будет неэффективно, если у вас мало тегов / товаров / предметов.

0
ответ дан 2 September 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: