2

変換したい

SELECT `users`.* FROM `users`
INNER JOIN `memberships`
    ON `memberships`.`user_id` = `users`.`id`
INNER JOIN `roles`
    ON `roles`.`id` = `memberships`.`role_id`
WHERE `memberships`.`group_id` = 'NUCC' AND (expiration > '2012-07-02')
ORDER BY `roles`.`rank` DESC

ActiveRecord アソシエーションに。

グループには、メンバーシップを通じて多くのメンバー (クラス User) があります。各メンバーシップには、別のテーブル (ロール) にマップされ、その後 AR モデル (ロール) にマップされるロール (role_id) があります。各ロールには、ランク (整数) が関連付けられています。

グループのメンバーをメンバーシップ-ロール-ランクで単純に並べ替えたいと思います。

4

1 に答える 1

2

テストされていない、おそらくタイプミスがありますが...

class User < ActiveRecord::Base
  has_many :memberships
  has_many :roles, :through => :memberships, :uniq => true
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
end

class Role < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships, :uniq => true
end

次に、ユーザーをroles.rankで並べ替えます。

q = User.joins(:memberships => :users)
q = q.where(:memberships.group_id => 'NUCC')
q = q.where("expressionn > '2012-07-02'")
q = q.order("roles.rank DESC")
puts q.to_sql

ARELを使用すると、そのようなものを非常に簡単に結合できます。たとえば、次のようINNER JOINSな構文を使用して、これをさらに進めることができます。

User.joins(:memberships => { :users => :someothermodel })

JOINを介して何かを参照する必要があるときはいつでも、その構造を複製することを忘れないでください。または、独自のSQLフラグメントを作成してください。

于 2012-07-03T04:01:27.260 に答える