Rails - 如何按ID范围选择所有记录

Zep*_*434 4 ruby sql orm activerecord ruby-on-rails

我试图通过他们的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
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个错误:

Unknown key: id
Run Code Online (Sandbox Code Playgroud)

我在我看来的实现是:

<%= list_cities(1,22) %>
Run Code Online (Sandbox Code Playgroud)

这是一个放在所有视图中的辅助方法,因此我没有将逻辑放在特定的控制器中.

我的这个模型的架构是:

  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
Run Code Online (Sandbox Code Playgroud)

当我在控制台中运行该方法时,我得到了:

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

我知道这不是一个空数据库的问题,因为它使用了以下版本的方法:

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
Run Code Online (Sandbox Code Playgroud)

但是,此方法仅返回第一个"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)
 => [] 
Run Code Online (Sandbox Code Playgroud)

我弄清楚它为什么会发生......

我在我的控制台中做了City.all并意识到我的城市以id"946"开头,因为我已多次播种,并且ID不是我认为的那样!提供的解决方案是正确的!

Dan*_*sky 14

City.where(:id => start..stop).order('name ASC').select(:name)
Run Code Online (Sandbox Code Playgroud)