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