0

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>

この動作を回避するには、スコープをどのように記述すればよいですか?

4

2 に答える 2

0

「house」という単語を取得したのは、それがあなたが求めたものだからだと思います。「house」というエントリを持つ単語です。「何がうまくいくか」の例で行ったように、2段階のアプローチをとります。

class Word < ActiveRecord::Base
  has_and_belongs_to_many :meanings
  has_many :synonyms, :through => :meanings
end

Word.where(entry: 'house').first.synonyms

これは、単語が存在することを前提としています... 実際には、同義語を呼び出す前に単語の存在を確認します。

于 2013-06-10T01:13:30.850 に答える