这是我的情况。我有一套单词列表。某些单词可以出现在多个列表中。对于每个单词/列表组合,我可能有一个例句。
词
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。
所以..我不确定最好的事情是什么。想法?
答案 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?
进行测试。