0

他の3つの関係を組み合わせた関係を作成しようとしています。最初の3つはすべて同じクラスです。コングロマリットが欲しいのですが、それを行うための優れた「アレル」方法が見つかりません。

これが私がやろうとしていることの例です。

動作するSQLクエリは

SELECT `records`.* FROM `records` INNER JOIN `memberships` ON `records`.`subject_membership_id` = `memberships`.`id` OR `records`.`recorder_membership_id` = `memberships`.`id` OR `records`.`subject_membership_id` = `memberships`.`id` WHERE `memberships`.`group_id` = 4

もちろん、私はそれをレールのようにやりたいと思っています。これが私がこれまでに持っているものです。かなり自明のはずなので、これ以上説明するのに時間を無駄にしません。

class Group < ActiveRecord::Base
  has_many :recorded_records, :through => :memberships, :source => :recorded_records, :class_name => "Record"
  has_many :reported_records, :through => :memberships, :source => :reported_records, :class_name => "Record"
  has_many :reviewed_records, :through => :memberships, :source => :reviewed_records, :class_name => "Record"

  #has_many :records through recorded_records, reported_records, reviewed_records??
  # Psuedo code above... Wondering how best to do this. I've tried...
  def records
    recorded_records | reported_records | reviewed_records
  end

  # But that makes three seperate database queries when what I really want is...
  # SELECT `records`.* FROM `records` INNER JOIN `memberships` ON `records`.`subject_membership_id` = `memberships`.`id` OR `records`.`recorder_membership_id` = `memberships`.`id` OR `records`.`subject_membership_id` = `memberships`.`id` WHERE `memberships`.`group_id` = 4

end

あなたたち最高!ありがとう :)

4

2 に答える 2

2

カスタム結合を使用してこれを行うことができます。上記のSQLの使用:

Record.joins('INNER JOIN `memberships` ON `records`.`subject_membership_id` = `memberships`.`id` OR `records`.`recorder_membership_id` = `memberships`.`id` OR `records`.`subject_membership_id` = `memberships`.`id` WHERE `memberships`.`group_id` = 4')

少しの作業で、これをモデル内のメソッドとして追加したり、パラメーターを受け入れたりすることができます。

ここのRailsguideは、使用例をいくつか示しています。.join

于 2013-02-22T13:08:02.620 に答える
0

Ok!ねえ、あなたの助けをどうもありがとう、@RiPuk。あなたは私の主張にいくつかの考えを駆り立てました。私がしたことは、selectステートメントからビューを作成することでした。

AS SELECT
  `records`.`id` AS `record_id`,
  `memberships`.`group_id` AS `group_id`
FROM (`records` join `memberships`) where ((`records`.`subject_membership_id` = `memberships`.`id`) or (`records`.`recorder_membership_id` = `memberships`.`id`) or (`records`.`subject_membership_id` = `memberships`.`id`));

このビューに名前を付けてからview_group_records、GroupRecordというActiveRecordモデルを(適切な関係で)作成し、グループモデルで、has_manyGroupRecordとの関係を設定してからhas_many :records, :through => :group_records

これはうまくいくようです!

しかし、あなたのソリューションは間違いなく機能します。

于 2013-02-22T20:49:25.013 に答える