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};");

まだWordレコードとして存在しない10個の新しい単語を一度にインポート(10個のレコードを作成)するだけです。

スキーマは次のようになります。

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クエリを思いつきました。私はアレルでも同じことができることを知っています。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 に答える