[英]How do I convert this raw SQL to Arel query?
在Rails(3.2)應用程序中,我在Model上有一個此類的類方法:
def import(level, max = 10)
db = ActiveRecord::Base.connection
result = db.execute("SELECT word FROM levels WHERE level == #{level} AND word NOT IN (SELECT entry FROM words) limit #{max};");
它一次只導入10個新單詞(創建10個記錄),而這些單詞現在還不作為Word記錄存在。
模式看起來像這樣:
create_table "levels", :force => true do |t|
t.string "word"
t.integer "level"
end
create_table "words", :force => true do |t|
t.string "entry"
t.integer "level", :default => 0
t.text "definition"
t.string "thesaurus", :default => "none"
end
我是SQL菜鳥。 與Rails dbconsole(sqlite3,我也在服務器上使用sqlite3)打交道,我不知何故想出了上面的原始sql查詢。 我有點知道我可以使用Arel做同樣的事情。 我應該如何用ActiveRecord構造查詢?
以下(未試用)應該起作用。 它在子查詢中使用pluck 。
Level.where(:level => level).where("word NOT IN (?)", Word.pluck(:entry)).limit(max)
@Gazler的解決方案看起來可行,但是我將提供使用MetaWhere
語法的替代方法, MetaWhere
語法更簡潔一些:
Level.where(:level => level, :word.not_in => Word.pluck(:entry)).limit(max)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.