簡體   English   中英

如何將原始SQL轉換為Arel查詢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM