2016-08-24 11 views
4

私は以下のモデルの関連付けを持っている:私はpart_of_speech_idsのセットを与えているActive Recordの単一のフィールド上で複数の条件

class PartOfSpeech < ActiveRecord::Base 
    has_many :part_of_speech_words 
    has_many :words, through: :part_of_speech_words 
end 

class Word < ActiveRecord::Base 
    has_many :part_of_speech_words 
    has_many :part_of_speeches, through: :part_of_speech_words 
end 

class PartOfSpeechWord < ActiveRecord::Base 
    belongs_to :part_of_speech 
    belongs_to :word 
end 

は[1,2,3]と言います。これらの関連で、これらのpart_of_speechesすべてを持つすべての単語を見つけなければなりません。 part_of_speech_ids [1,2,3,4]の単語が表示される必要がありますが、[1,2]のみの単語は表示されません。

INと照会すると、またはという操作が実行されるため、正しい結果が得られません。配列要素にを実行するものが必要です。

助けてください。

+0

それに見てください。http://stackoverflow.com/questions/26143595/rails-複数のIDを持つ条件付きでクエリ可能なもの –

答えて

0

あなたが参加し、テーブル内word_idpart_of_speech_idのためのユニークなインデックスを持って考えると、あなただけのmathchingレコードをカウントすることができます:

word_ids = PartOfSpeechWord. 
    select('min(word_id) AS word_id'). 
    where(part_of_speech_id: part_of_speech_ids). 
    group_by(:part_of_speech_id). 
    having('COUNT(part_of_speech_id) >= ?', part_of_speech_ids.size). 
    map { |x| x['word_id'] } 

word = Word.where(id: word_ids) 
+0

part_of_speech_idsが[1,2,3]の場合、[1,2,3]に一致する結果を並べる方法はありますか?[1 、2]、最後の[1]私はこれが以前の私の要求ではないことを知っています。しかし、これも論理に追加する必要があります –

+0

たとえば、一連のクエリを実行できます。しかし、何らかのキャッシュを導入するほうが容易に聞こえます。 'Word'モデルに' part_of_speech_ids'配列属性を追加し、関連するレコードのIDをキャッシュする必要があるときはいつでも更新することができます( 'after_touch'コールバックが役に立ちます)。次に、その属性を照会するだけです。 – EugZol

関連する問題