1

結合テーブルに存在する追加のフィールドに基づいて、多対多の関係を照会する方法に興味があります。例を通して最もよく尋ねられます。

モデルUserとモデルGroupがあります。

多対多の関係は グループ化 と呼ばれます。追加のフィールド'active_user'があります。アクティブなグループ内のすべてのユーザーを照会したいと思います。

私が行った場合:

@user.groupizations.find_all_by_active_user(true)- グループ化のリストが表示されます。ただし、ユーザーのリストを探しています。多分私はいくつかのマッピングを行う必要がありますか?

ありがとう!

4

2 に答える 2

1

これを行うには、関連付けをクエリに結合し、関連付けられたテーブルのスコープで検索します。

User.joins(:groupizations).where(:groupizations => {:active_user => true})

複数のグループ化がこの基準を満たす場合、重複する行が返されることに注意してください。個別のユーザーを取得するには、次のいずれかを実行できます。

  • .select("DISTINCT users.*")ORDER 句を使用して呼び出しを追加します.order("users.id")(必要に応じて並べ替え列を変更します)。
  • 次のように GROUP BY 句を追加します.group("users.id")。MySQL 以外のデータベースの場合は、より具体的にし、すべての列をグループに含める必要がある場合があります。

    .group(User.column_names.map{|c| "users.#{c}"}.join(','))

于 2013-01-09T22:44:48.640 に答える
0

結合テーブルに追加のフィールドがある場合は、has_many_to_many の代わりに has_many :through を使用する必要があります。同じ API でより多くのことができます

class User
  has_many :groupizations
  has_many :groups, through: groupization

  scope :active, joins(:groupizations).where("groupizations.active_user='1'")
end

# controller
@active_users = User.active
于 2013-01-09T22:59:26.007 に答える