ActiveRecord查找包含对表的记录可能不存在

时间:2014-11-05 15:27:26

标签: ruby-on-rails ruby activerecord eager-loading

这是我的情况。我有一套单词列表。某些单词可以出现在多个列表中。对于每个单词/列表组合,我可能有一个例句。

class Word < ActiveRecord::Base
  has_and_belongs_to_many :lists
  has_many :sample_sentences
end

解释

class List < ActiveRecord::Base
  has_and_belongs_to_many :words
  has_many :sample_sentences
end

示例句子

class SampleSentence < ActiveRecord::Base
  belongs_to :word
  belongs_to :list
end

...为了支持HABTM,我有一个联接表。

一切正常除了这个:

使用预先加载,我想抓住特定列表中的所有单词该特定列表中该单词的示例句子。

我尝试了很多变体,包括范围,等等。

大多数变体看起来像这样(在IRB中测试)

w=Word.includes(:sample_sentences).where(Words: {id: 48}).where(sample_sentences: {list_id: 6})[0]

如果单词在关联列表中有一个例句,则效果很好。如果单词在列表中没有例句,则有效。它不返回任何记录。

文档Active Record Query Interface和Stack Overflow上的无数问题告诉我,生成的sql使用左外连接来获取数据。我相信我的问题是sample_sentences表中额外的WHERE的结果,它似乎消除了从查询中取回一个没有样本句子的单词的可能性。

确实证实了这一点..如果我删除sample_sentences表中的附加位置,无论该单词是否具有相关的样本句子,我都会得到记录。问题是,我也回复了我不感兴趣的例句。

开发数据库引擎是SQL Lite。制作将是MySQL。

所以..我不确定最好的事情是什么。想法?

1 个答案:

答案 0 :(得分:1)

如果我正确地阅读了您的请求Using eager loading, I would like to grab all words in a particular list and the sample sentences for that word for that particular list.。您似乎想要所有单词,无论他们是否有评论。试试这个:Word.includes(:sample_sentences, :lists).where(lists: {id: #List id })。这将包括样本句子(如果存在),您可以使用empty?进行测试。