2016-05-23 11 views
0

私はRuby on RailsとPostgresを使用していますが、イベント、スピーカー、Event_Speakerの3つのテーブルがあります(最後は双方向のhas_many, through関係イベントとスピーカーの間)。他の子レコードと共に特定の子レコードを持つ親を探すActiveRecordクエリが必要

個別のスピーカーのshowビューでは、そのスピーカーのすべてのイベントだけでなく、そのスピーカーだけのイベントの数も表示しようとしています(そのスピーカーのイベントと1つ以上のイベントその他)。

私はこの後半部分を達成できるActiveRecordクエリを考え出すことができません。何か案は?

+0

を行うことができますevents_speakersになります)。あなたは作ることができません:イベント:has_many =>スピーカー。メインスピーカーがあれば、イベントに追加できます:has_one =>:main_speaker、:as =>スピーカー、:foreign_key =>:main_speaker_id? –

+0

@MauricioMoraes複数のイベントでスピーカーが話す可能性があるので、 –

+0

1つのイベントでスピーカーの数をカウントし、選択したスピーカーのイベントから1つだけを選択できますか? – lusketeer

答えて

2

したがって、Mauricio Moraesのコメントに基づいて答えを出すことができます。

移行

def change 
    add_column :events, :speakers_count, :integer, default: 0 
end 

モデル

class EventSpeaker 
    belongs_to :event, counter_cache: :speakers_count 
    belongs_to :speaker 
end 

は、だから今、あなたが参加するテーブルevent_speaker(正しい名前を必要とする理由私が見ることができない単純なクエリ

speaker = Speaker.first 
only_speaker_events = speaker.events.where(speakers_count: 1) 
+1

データのシードについては、[こちら](http://ryan.mcgeary.org/2016/02/05/proper-counter-cache-migrations-in-rails/)をチェックしてください。 –

1

selectを使用するとどうなりますか?データベースからスピーカーのすべてのイベントをロードし、複数のスピーカーを持つスピーカーを拒否します。

speaker.events.select { |e| e.speakers.count == 1 } 
+1

あなたが10だけを保つつもりなら、1,000レコードを読み込むのはちょっとばかげているようです。 –

+0

ありがとう!私はそれがパフォーマンス上の問題を説明するので、他の答えを受け入れましたが、これは確かに簡単でポイントです。感謝! – jayp

+0

>唯一10を保つつもりならば、1,000レコードを読み込むのはちょっとばかげているようです。 確かに。 – Kris

関連する問題