2014-11-05 66 views
0

这是我的情况。我有一套单词列表。有些词可以出现在多个列表中。对于每个单词/列表组合,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。

所以..我不知道最好的事情是做什么。思考?

+0

如果我正确阅读您的请求使用急切加载,我想抓住特定列表中的所有单词以及该单词的特定列表的例句。无论他们是否有评论,看起来你都想要所有的单词。试试这个:'Word.includes(:sample_sentences,:lists).where(lists:{id:#List id})'。这将包括例句,如果它们存在,你可以用'empty?'来测试。 – nikkon226 2014-11-05 15:37:06

+0

@ nikkon226 - 这太好了。正是我需要的。谢谢。请作为答复发布,我会接受它。 – Chris 2014-11-06 02:44:27

回答

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?进行测试。

相关问题