5

ID ですべての都市 (name 属性のみを選択) に対してクエリを実行しようとしていますが、選択する ID の範囲を指定できるようにしたいと考えています。私のコードは以下の通りです:

def list_cities(start, stop)
  cities = City.all(order: 'name ASC', id: start..stop, select: 'name')
  cities.map { |city| "<li> #{city.name} </li>" }.join.html_safe
end

ただし、エラーが発生します。

Unknown key: id

私の見解での私の実装は次のとおりです。

<%= list_cities(1,22) %>

これはすべてのビューに配置されるヘルパー メソッドであるため、特定のコントローラーにロジックを配置するわけではありません。

このモデルの私のスキーマは次のとおりです。

  create_table "cities", :force => true do |t|
    t.datetime "created_at",      :null => false
    t.datetime "updated_at",      :null => false
    t.string   "neighborhoods"
    t.string   "name"
    t.integer  "neighborhood_id"
  end

コンソールでメソッドを実行すると、次のようになりました。

City Load (0.9ms)  SELECT name FROM "cities" WHERE ("cities"."id" BETWEEN 1 AND 3) ORDER  BY name ASC
 => "" 

次のバージョンのメソッドで機能したため、データベースが空の場合の問題ではないことはわかっています。

def list_cities(start, stop)
  cities = City.all(order: 'name ASC', limit: stop - start, select: 'name')
  cities.map { |city| "<li> #{city.name} </li>" }.join.html_safe
end

ただし、このメソッドは最初の「n」レコードのみを返し、必要な範囲は返しません。


コンソールでより単純なクエリを試す場合:

1.9.3p385 :009 > City.where(:id => 1..4)
  City Load (0.9ms)  SELECT "cities".* FROM "cities" WHERE ("cities"."id" BETWEEN 1 AND 4)
 => [] 

どうしてこうなったのか・・・よくわかりました。

コンソールで City.all を実行したところ、自分の都市が ID "946" で始まっていることに気付きました。これは、複数回シードしたため、ID が思っていたものと異なっていたためです。提供されたソリューションは正しかったです。

4

3 に答える 3