3

多くのメモを持つ連絡先モデルがあります。私のアプリのあるページで、連絡先のテーブルのいくつかの属性 (名前、電子メール、最新のメモ created_at) を表示します。

note 列については、すべての連絡先とその最新のメモ (またはその created_at のみ) を取得する結合ステートメントを作成しようとしています。

メモではなく連絡先を制限して注文するため、私が思いついたのは正しくありません。

current_user.contacts.joins(:notes).limit(1).order('created_at DESC')
4

1 に答える 1

1

created_at各連絡先の最新のメモの値だけが必要な場合は、最初にクエリを作成して最大値を見つけてから、そのクエリに結合できます。

max_times = Note.group(:contact_id).select("contact_id, MAX(created_at) AS note_created_at").to_sql
current_user.contacts.select("contacts.*, note_created_at").joins("LEFT JOIN (#{max_times}) max_times ON contacts.id = max_times.contact_id")

最新のメモの Note オブジェクトを操作する場合、1 つのオプションは、メモを選択し、contact_id. 次に、各連絡先を操作する際に、ハッシュからそれらを読み取ることができます。

max_times = Note.group(:contact_id).select("contact_id, MAX(created_at) AS note_created_at").to_sql
max_notes = Note.select("DISTINCT ON (notes.contact_id) notes.*").joins("INNER JOIN (#{max_times}) max_times ON notes.contact_id = max_times.contact_id AND notes.created_at = note_created_at").where(contact_id: current_user.contact_ids)
max_notes.group_by(&:contact_id)

これは、2 つのノートのand値DISTINCT ONがまったく同じ場合に重複を削除するために使用されます。PostgreSQL を使用していない場合は、重複を処理する別の方法が必要になります。contact_idcreated_at

于 2015-06-04T09:50:52.837 に答える