0

我正在 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>

我应该如何编写我的范围以避免这种行为?

4

2 回答 2

0

我错了,Rails 回答:

Word.syno.find_by_entry('house')

是一个嵌套散列,具有 allhouse的含义和同义词。

我在 Rails 控制台中测试了这段代码,我被控制台的输出误导了,它只显示了对第一个查询的响应(即单词“house”)。但是,当我在我的 Rails 应用程序中进行测试时,一切正常。

尽管如此,我仍然必须找出为什么控制台的输出不包括最后一个查询的结果。

于 2013-06-12T11:48:18.080 回答
0

我想你得到了“房子”这个词,因为这就是你所要求的,一个有“房子”条目的词。我会采取两阶段的方法,就像你对“什么有效”的例子所做的那样。

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 回答