我正在 Rails 3.2.13 中构建一个同义词词典应用程序,其中每个单词都有很多含义,并且每个含义都与许多单词相关联。
因此,为了获得搜索词(例如“house”)的所有同义词,我希望能够执行以下操作:
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
目前,我可以获得“house”的同义词,代码如下: 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>
我应该如何编写我的范围以避免这种行为?