именованная область, основанная на количестве связанных записей - PullRequest
0 голосов
/ 03 февраля 2012

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

class Season
  has_many :season_members
  has_many :users, :through => :season_members

  def returning_members
    users.select { |u| u.season_members.count > 1 }
  end
end

class SeasonMember
  belongs_to :season
  belongs_to :user
end

class User
  has_many :season_members
end

Можно ли использовать: группу и друзей, чтобы переписать метод returning_membersкак область?

Я использую Rails 2.3, но я также приму решения, основанные на более новых версиях.

1 Ответ

1 голос
/ 04 февраля 2012

Не уверен, действительно ли вы хотите включить эту область в сезон, поскольку это будет означать, что вы ищете сезоны, у которых есть постоянные пользователи. Но я предполагаю, что вы хотите, чтобы у пользователей были повторные сезоны. С этим допущением, ваша область будет:

class User < ActiveRecord::Base
 scope :repeat_members, 
    :select=>"users.*, count(season_members.season_id) as season_counter",
    :joins=>"JOIN season_members ON season_members.user_id = users.id",
    :group=>"users.id",
    :having=>"season_counter > 1"
end

, что приведет к следующему запросу:

 SELECT users.*, count(season_members.season_id) as season_counter FROM "users" JOIN season_members ON season_members.user_id = users.id GROUP BY users.id HAVING season_counter > 1

Подтверждено с помощью: Rails 3.1.3 и SQLite3

...