Rails 3.2.13 で、すべての単語に多くの意味があり、すべての意味が多くの単語に関連付けられている同義語辞書アプリを構築しています。
したがって、検索された用語 (「家」など) のすべての同義語を取得するには、次のようなことができるようにしたいと考えています。
Word.syno.find_by_entry('house')
次のように、スコープを使用して実装してみました。
class Meaning < ActiveRecord::Base
has_and_belongs_to_many :words
has_and_belongs_to_many :synonyms, :class_name => "Word"
end
class Word < ActiveRecord::Base
attr_accessible :entry
has_and_belongs_to_many :meanings•
scope :syno, includes(:meanings => :synonyms)
end
現在、次のようなコードで「家」の同義語を取得できます。 Word.find_by_entry('house').meanings.first.synonims
しかし、私が尋ねるとWord.syno.find_by_entry('house')
、「家」という言葉自体が得られ、その同義語は何も得られません。
これらは、その最後の式に対して、Rails コンソールによって報告された、生成された SQL クエリです。
1.9.3p286 :011 > Word.sino.find_by_entry("house")
Word Load (0.5ms) SELECT `words`.* FROM `words` WHERE `words`.`entry` = 'house' LIMIT 1
SQL (0.3ms) SELECT `meanings`.*, `t0`.`word_id` AS ar_association_key_name FROM `meanings` INNER JOIN `meanings_words` `t0` ON `meanings`.`id` = `t0`.`meaning_id` WHERE `t0`.`word_id` IN (10112)
SQL (12.9ms) SELECT `words`.*, `t0`.`meaning_id` AS ar_association_key_name FROM `words` INNER JOIN `meanings_words` `t0` ON `words`.`id` = `t0`.`word_id` WHERE `t0`.`meaning_id` IN (1174, 3941, 4926, 7360)
=> #<Word id: 10112, entry: "house", changed_at: nil, updated_at: nil>
この動作を回避するには、スコープをどのように記述すればよいですか?