這是我的情況。我有一套單詞列表。有些詞可以出現在多個列表中。對於每個單詞/列表組合,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。
所以..我不知道最好的事情是做什麼。思考?
如果我正確閱讀您的請求使用急切加載,我想抓住特定列表中的所有單詞以及該單詞的特定列表的例句。無論他們是否有評論,看起來你都想要所有的單詞。試試這個:'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