0

私は、メンバーシップ モデルを通じて has_many チームを持つユーザーがいる Rails プロジェクトに取り組んでいます。ユーザーには、(公開、非公開、または保護) のプライバシー設定があります。

現在のユーザーのホームページで、プロファイルが公開に設定されているすべてのユーザーだけでなく、プロファイルが保護に設定されており、現在のユーザーとチームを共有しているユーザーも表示したいと考えています。

これを 2 つの個別のクエリとして実行し、結果の配列を結合することもできますが、1 つにしておく方が「良い」と想定しています。

.or 条件のために Arel を使用する必要があるかもしれないと考えましたが、共有チームを作成するために必要な結合について頭を悩ませることができません。

私は AREL、SQL、および Stackoverflow を初めて使用するので、あまり意味がない場合は申し訳ありません。

4

1 に答える 1

0

以下の設定を想定しています。

class User < AR
  has_many :memberships
  has_many :teams, through: :memberships
end

class Membership < AR
  belongs_to :user
  belongs_to :team
end

class Team < AR
  has_many :memberships
  has_many :teams, through: :memberships
end

次に、これは機能するはずです:

sql = <<QUERY
SELECT users.* FROM users WHERE users.privacy_setting = 'public'
UNION
SELECT users.* FROM users JOIN memberships ON users.id = memberships.user_id
WHERE memberships.team_id IN (#{current_user.team_ids})
AND users.privacy_setting = 'protected'
QUERY

# use the paginated find_by_sql method (provided by will_paginate)
User.paginate_by_sql(sql, page: params[:page], per_page: 50)

もちろん、列名などは設定によって異なります...

PS: AREL は必要ないと思います...

于 2013-04-10T15:31:34.643 に答える