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 が思っていたものと異なっていたためです。提供されたソリューションは正しかったです。