1

在 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 构造查询?

4

2 回答 2

1

@Gazler 的解决方案看起来很有效,但我将提供一种MetaWhere更简洁的语法替代方案:

Level.where(:level => level, :word.not_in => Word.pluck(:entry)).limit(max)
于 2012-04-16T10:23:20.473 回答
1

以下(未经测试)应该可以工作。它在子查询中使用pluck

Level.where(:level => level).where("word NOT IN (?)", Word.pluck(:entry)).limit(max)
于 2012-04-16T09:55:29.267 回答