2014-11-05 102 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?進行測試。

相關問題