我正在尝试按ID查询所有城市(仅选择其名称属性),我希望能够指定要选择的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不是我认为的那样!提供的解决方案是正确的!
答案 0 :(得分:14)
City.where(:id => start..stop).order('name ASC').select(:name)
答案 1 :(得分:0)
您可以将查询转为以下内容:
cities = City.all(order: 'name ASC', conditions: { id: start..stop }, select: 'name')
答案 2 :(得分:0)
City.find((start..stop).to_a,:select=>:name,:order=>'name ASC')