2010-01-26 49 views
1

我是rails和ruby的新手。如何通過集合循環並找到軌道中的東西

我有用戶和存儲之間的has_many關聯

下面

是我做的:

@user = User.find_by_userid_and_password("someuser", "12345") 
=> #<User id: 1, userid: "someuser", password: "12345", 
created_at: "2010-01-25 00:00:00", updated_at: "2010-01-25 00:00:00"> 
@user.stores 
=> [#<Store id: 3, store_id: 3, store_name: "New Store 2", 
created_at: "2010-01-25 00:00:00", updated_at: "2010-01-25 00:00:00">, 
#<Store id: 5, store_id: 5, store_name: "Store 14th and M", 
created_at: "2010-01-25 00:00:00", updated_at: "2010-01-25 00:00:00">] 

所以基本上我先驗證用戶身份,然後讓用戶所屬的所有門店。爲此我得到一個清單。在那個哈希列表中,我想知道是否有任何與store_id == 4

順序我做的:

@user.stores.first.store_id==4 
false 
@user.stores.second.store_id==4 
false 

我如何能在一個循環做這個?有沒有更好的方法來做到這一點。

回答

6

歡迎的Rails,

你最好的做法在這裏可能不是使用一個循環,但鏈發現你的第一個發現者。

例如:

@user.stores.find(store_id)

這將充分利用數據庫,並要快得多。

退房的API

如果你想循環中,您做類似下面

@user.stores.each do |store| 
    @my_store = store if store.id == store_id 
end 

@my_store = @user.stores.select{|s| s.id == store_id}

@contains_store = @user.stores.include?{|s| s.id == store_id}

祝你好運,

+0

謝謝。如果我做'@ user.stores.find(6)',因爲6不是其中的一個,它會返回一個錯誤。那我怎麼會把這個放在一個if條件呢? 'if @ user.stores.find(6)!= nil ...'那可以嗎? – mustaine 2010-01-26 12:38:49

+0

你可以做find_by_id(6),它將返回一個數組(不會拋出錯誤),然後檢查是否爲零。 @ user.stores.find_by_id(6).first.nil? – Jonathan 2010-01-26 13:23:26

+1

由於nil在Ruby中是錯誤的,所以你可以'if @ user.stores.find(6)...',你不必手動比較nil,因爲你只是用真/假表達式運行。 – Eric 2010-01-26 17:17:16