2011-01-21 7 views
3

私はレールに、ユーザーに属するgame_itemを参照するモデルを用意しています。この武器にはアイテムが装備されているかどうかに似ている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.html、後http://asciicasts.com/episodes/215-advanced-queries-in-rails-3

+0

ああ、私は:) – Spyros

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

ありがとうを必要とまさに偉大なありがとう、私は実際にそのようなスコープでそれをしたと思った: スコープ:item、lambda {| item_type | \t結合(:game_item)。 \t( "game_items.item_type =?"、item_type) } – Spyros