ActiveRecord查找与包括对表可能不存在的记录
这是我的情况。我有一套单词列表。有些词可以出现在多个列表中。对于每个单词/列表组合,I 可能都有一个例句。ActiveRecord查找与包括对表可能不存在的记录
词
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。
所以..我不知道最好的事情是做什么。思考?
如果我正确阅读您的请求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?
进行测试。
如果我正确阅读您的请求使用急切加载,我想抓住特定列表中的所有单词以及该单词的特定列表的例句。无论他们是否有评论,看起来你都想要所有的单词。试试这个:'Word.includes(:sample_sentences,:lists).where(lists:{id:#List id})'。这将包括例句,如果它们存在,你可以用'empty?'来测试。 – nikkon226 2014-11-05 15:37:06
@ nikkon226 - 这太好了。正是我需要的。谢谢。请作为答复发布,我会接受它。 – Chris 2014-11-06 02:44:27