我正在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')
时,我会得到'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>
我应该如何编写我的范围以避免这种行为?
答案 0 :(得分:0)
我认为你得到了'house'这个词,因为这就是你所要求的,这个词有一个'house'。我会采取两阶段的方法,就像你用“什么有效”的例子一样。
class Word < ActiveRecord::Base
has_and_belongs_to_many :meanings
has_many :synonyms, :through => :meanings
end
Word.where(entry: 'house').first.synonyms
这假设单词存在......在实践中,你会在调用它的同义词之前检查单词是否存在。
答案 1 :(得分:0)
我错了,Rails回答:
Word.syno.find_by_entry('house')
是一个嵌套的哈希,包含所有house
的含义和同义词。
我在Rails控制台中测试了这段代码,并且我被控制台的输出误导了,它只显示了对第一个查询的响应(即“house”这个词)。但是,当我在Rails应用程序中测试时,一切正常。
尽管如此,我仍然必须找出为什么控制台的输出不包括最后一个查询的结果。