Как найти все, что имеет множество связей во многих со многими с Rails3, элегантным способом? - PullRequest
0 голосов
/ 01 февраля 2011

У меня есть класс пользователя с

class User < ActiveRecord::Base
  has_many :forum_subscriptions
  has_many :forums, :through => :forum_subscriptions

И форумный класс с

class Forum < ActiveRecord::Base
  has_many :users

Я хочу найти всех пользователей, которые подписаны на форум "спорт", форум "ТВ" и форум "Хобби" Какой самый элегантный способ сделать это?

(у меня в голове много уродливых вещей :-)

1 Ответ

0 голосов
/ 01 февраля 2011

Вот что я хотел бы использовать:

User.joins(:forums).where("forums.title IN (?)", %w(sport TV Hobby)).group("users.id")

Я предположил, что столбец для заголовка форума - это «заголовок». Измените это, когда вы используете другое имя. Вы можете поместить это в удобную область внутри пользовательской модели, чтобы сделать ее немного более динамичной.

scope :subscribed_to, lambda { |forum_titles| joins(:forums).where("forums.title IN (?)", forum_titles).group("users.id") }

Теперь вы можете вызвать эту область изнутри Контроллера или другого места:

User.subscribed_to(%w(sport TV Hobby)) # => Get all users that are subscribed to sport, TV and Hobby
User.subscribed_to(["sport", "TV", "Hobby"]) # => Does the same
User.subscribed_to(%w(Hobby)) # => Get all users that are subscribed to Hobby
User.subscribed_to("Hobby") # => Does the same

Я предполагал, что у вас есть следующие отношения:

class User < ActiveRecord::Base
  has_many :forum_subscriptions
  has_many :forums, :through => :forum_subscriptions
end
class Forum < ActiveRecord::Base
  has_many :forum_subscriptions
  has_many :users, :through => :forum_subscriptions
end
class ForumSubscription < ActiveRecord::Base
  belongs_to :user
  belongs_to :forum
end

Надеюсь, это то, что вам нужно. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...