2011-01-21 52 views
3

我有一個引用屬於用戶的game_item的rails模型。該武器有一個is_equipped列,類似於該物品是否配備。 game_item可以是武器,頭盔等(由game_item模型中的item_type指定)。Rails上不同列類型的最佳做法

現在,我正在尋找一種很好的方式來獲得每種類型的配備物品。我可以做類似get_equipped_item(類型)和指定類型的東西,或get_equipped_helmet,get_equipped_weapon等。 我正在尋找更好的方式來做到這一點,導軌的方式:)任何想法?

回答

5

您可以使用scopes

喜歡的東西

scope :equipped, where(:is_equipped => true) 
scope :helmet, where(:item_type => 'helmet') 
scope :weapon, where(:item_type => 'weapon') 

然後把它們作爲

ModelName.equipped # => all equipped items 
ModelName.helmet.equipped # => all equipped helmets 

延伸閱讀:http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.htmlhttp://asciicasts.com/episodes/215-advanced-queries-in-rails-3

+0

啊,偉大的感謝名單正是我需要:) – Spyros 2011-01-21 22:43:59

0
rails generate scaffold GameItem item_type:string is_enabled:boolean 

rake db:migrate 

rails console 

a = GameItem.new(:item_type => "helmet", :is_enabled => true) 
b = GameItem.new(:item_type => "gun", :is_enabled => false) 
c = GameItem.new(:item_type => "knife", :is_enabled => true) 

s = [a, b, c] 

s.find_all{|item| item.is_enabled == true} 

s.size // size is 2 since 2 of the items in the array have is_enabled set to true. 
+0

感謝名單,後有些人認爲我實際上是這樣做的: scope:item,lambda {| item_type | \t連接(:game_item)。 \t其中(「game_items.item_type =?」,item_type) } – Spyros 2011-01-22 00:24:58