2013-04-30 51 views
4

我試圖通過他們的ID對所有城市(僅選擇他們的名稱屬性)進行查詢,我希望能夠指定一個ID範圍來選擇。我的代碼如下:Rails - 如何通過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在我的控制檯,並意識到我的城市以身份證號碼「946」開始,因爲我已經多次播種,身份證不是我認爲的那樣!提供的解決方案是正確的!

+0

模式是什麼樣的? – 2013-04-30 03:23:39

回答

13
City.where(:id => start..stop).order('name ASC').select(:name) 
+0

它可能是我的模式? – Zephyr4434 2013-04-30 04:09:43

+0

似乎它由於某種原因返回一個空白數組。 – Zephyr4434 2013-04-30 04:31:27

+0

我發現了這個問題 - 請看我更新的問題。謝謝! – Zephyr4434 2013-05-04 15:09:10

0

你可以把你的查詢到如下:

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

斯佩蘭斯基DANIL的答案應該很好地工作。你也可以試試這個:

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