【问题标题】:Rails - how to select all records by ID rangeRails - 如何按ID范围选择所有记录
【发布时间】:2013-04-30 03:20:52
【问题描述】:

我正在尝试通过 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 不是我想象的那样!提供的解决方案是正确的!

【问题讨论】:

  • 架构是什么样的?

标签: sql ruby-on-rails ruby activerecord orm


【解决方案1】:
City.where(:id => start..stop).order('name ASC').select(:name)

【讨论】:

  • 可能是我的架构有问题吗?
  • 似乎由于某种原因它返回了一个空白数组。
【解决方案2】:

您可以将查询转换为以下内容:

cities = City.all(order: 'name ASC', conditions: { id: start..stop }, select: 'name')

【讨论】:

    【解决方案3】:

    Speransky Danil 的回答应该可以完美运行。你也可以试试这个:

    City.find((start..stop).to_a,:select=>:name,:order=>'name ASC')
    

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      相关资源
      最近更新 更多