2016-03-25 6 views
0

は私が持っているレール:どのようにスコープに委任できますか?

class UserItem < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :item 

    scope :equipped, -> { where(equipped: true) } 
end 

class Item < ActiveRecord::Base 
    has_many :user_items 
    has_many :users, through: :user_items 

    scope :armor, -> { where(type: 'Armor') } 
    delegate :equipped, to: :user_items 

end 

編集:私はしようとした場合

User.first.items.equipped =>undefined method 'equipped' for #<ActiveRecord::Associations::CollectionProxy []>

User.first.items.armor.equipped =>undefined method 'equipped' for #<ActiveRecord::AssociationRelation []>

がどのように私はスコープに委任することができますか?

+0

こんにちは、私はあなたが実際にやろうとしていないかもしれない理由と、親スコープを使って子アイテムを取得するために必要なアプローチを説明しました。 – Matt

+0

「マージ」が解決策であることを私が確信しているので、私は疑問を誤解しているはずです。がんばろう! – Matt

答えて

-1

スコープに簡単に委任することはできませんし、子ではなく対象クラス(UserItem)からオブジェクトを返すこともできません。

代わりに、あなたは非常に単純にスコープをマージすることができます

class UserItem < ActiveRecord::Base 
    scope :equipped, -> { where(equipped: true) } 
end 

class Item < ActiveRecord::Base 
    scope :equipped, -> {joins(:user_items).merge(UserItem.equipped)} 
end 

=> Item.equipped 
=> collection of items for which they have a user_item association that is equipped 

編集:この機能に関するいくつかのドキュメントを。

再び

Using Named Scopes Across Models with ActiveRecord#Merge http://apidock.com/rails/ActiveRecord/SpawnMethods/merge

編集:

あなたは本当にあなたが項目に呼び出すメソッドからUserItemsのコレクションを返すようにしたい場合は、次のようにあなたが行うことができます:

class Item 
    class << self 
    delegate :equipped, to: :UserItem 
    end 
    ... 

しかし、これはアイテムではなく、コレクション内のUserItemsを返します。それはなぜこれを全部委譲するのかという疑問をひきおこすか? アイテムのコレクションが必要で、装備されているUserItemのコレクションでこれらのアイテムを制限する場合は、mergeを使用します。

+0

Itemにスコープを使用したい場合、私は使用します: 'scope:equipped、 - > {inventory_items:{equipped:true}}' 'しかし、それは私の質問ではありません^^(私はdownvoteしません) – Matrix

+0

@Matrix私の例のスコープは 'Item'モデルにあり、ユーザーアイテムモデルを結合し、' equipped'スコープを使用して 'user'items'によって返される' items'を制限します。あなたの質問を大いに誤解していない限り、これはあなたが望むものですか?基本的に、これは 'item from。* item items from user_items where user_items.equipped = true'を選択します。 'UserItem'オブジェクトのコレクションを返したいですか? – Matt

+0

いいえ、あなたは質問を理解していますが、アイテムのモデルでは、私は追加することができます: 'スコープ:装備、 - > {ここで、(user_items:真}:{装備)}で'(、「ユーザー」によって、その間違いを「在庫」を置き換えます私の最後のcom)とそれはうまく動作します。しかし、私の質問は:どのようにUserItemのスコープをItemクラスのスコープを再定義しないようにするか? – Matrix

関連する問題