Rails自引用嵌套关联不适用于范围

时间:2013-06-09 22:58:23

标签: ruby-on-rails-3 associations

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

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

2 个答案:

答案 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应用程序中测试时,一切正常。

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