Как вы объединяете много людей в Rails 3? - PullRequest
2 голосов
/ 15 февраля 2011

У меня есть 3 модели: учетная запись, обсуждение и тег (предоставленный is_taggable)

class Account
  has_many :discussions
end

class Discussion
  belongs_to :account
  has_many :tags

  is_taggable
end

Я хочу иметь возможность сделать current_account.tags, чтобы перечислить все теги, которые в настоящее время используются обсуждениями аккаунта. Итак ...

class Account
  has_many :discussions
  has_many :tags, :through => :discussions, :source => :taggings
end

Примечание: источник тегов предназначен для таблицы соединений, которую is_taggable использует для объединения тегов в вашу модель тегов (в данном случае обсуждения ...)

Проблема с выходом из этого HM: таким образом, многократное вхождение одного и того же тега в разные обсуждения заставит их появляться в этой ассоциации одинаковое количество раз. Поэтому я подумал: «Нет проблем, я сгруппирую эту ассоциацию в tag_id таблицы тегов, поэтому каждый тег отображается только один раз.

class Account
  has_many :discussions
  has_many :tags, :through => :discussions, :source => :taggings, :group => "taggings.tag_id"
end

Это не работает, дальнейшее изучение SQL, которое генерируется, показывает, что GROUP BY не появляется в SQL. Мой вопрос, как мне заставить это работать?

Некоторые другие вещи, которые я пробовал:

  • Создание экземпляра метода «теги». Хотя это вернуло мой набор результатов должным образом, это не была коллекция AR, и поэтому я не мог манипулировать ею как таковой. (может, кто-то знает, как это сделать правильно?)
  • Используйте параметр: unique => true. Похоже, это сработает, но так как мы создаем таблицу: taggings, это то, что она пытается сделать уникальной, и все записи в этой таблице уникальный (tag_id + taggable_id [наше обсуждение]), ничего не меняется.

Заранее благодарим за любую помощь и приносим извинения за любые опечатки, связанные с iPad.

1 Ответ

1 голос
/ 16 февраля 2011

Используйте именованную область видимости для тегов, например:

scope :account, lambda { |account|
  select('DISTINCT taggings.*').
  join('discussions on discussions.id = taggings.discussion_id').
  where("discussions.account_id = ?", account.id)
}

Тогда просто назовите это как:

Tags.account(current_account)

И ты вернешь коллекцию AR. Вы также можете добавить метод к своей модели учетной записи, который только что назвал эту область в тегах с self, например:

def tags.
  Tags.account(self)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...