如何将此原始SQL转换为Arel查询



在 Rails(3.2) 应用程序中,我在模型上有一个类方法,如下所示:

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语法提供替代方案:

Level.where(:level => level, :word.not_in => Word.pluck(:entry)).limit(max)

相关内容

  • 没有找到相关文章

最新更新