私のモデルのうちの2つが似ていることに間違いなく気付いた。その名前はGameItemとOwnedItemです。 GameItemはゲームの単なるアイテムですが、OwnedItemはプレーヤーがそのアイテムを持っているかどうか、それが自分の在庫や倉庫などにあるかどうかを表します。モデルを組み合わせてレールの方法をスコープ
class OwnedItem < ActiveRecord::Base
belongs_to :user
belongs_to :game_item
belongs_to :ownable, :polymorphic => true # [warehouse|inventory]
scope :equipped, where(:is_equipped => 1).includes(:game_item)
scope :item, lambda { |item_type|
joins(:game_item).
where("game_items.item_type = ?", item_type).
limit(1)
}
scope :inventory, where(:ownable_type => 'Inventory')
scope :warehouse, where(:ownable_type => 'Warehouse')
end
class GameItem < ActiveRecord::Base
scope :can_be_sold, where(:is_sold => 1)
scope :item_type, lambda { |item_type|
where("game_items.item_type = ?", item_type)
}
scope :item_types, lambda { |item_types|
where("game_items.item_type IN (?)", item_types)
}
scope :class_type, lambda { |class_type|
where("game_items.class_type = ?", class_type)
}
scope :grade, lambda { |grade|
where("game_items.grade = ?", grade)
}
end
お知らせgame_item.item_typeの問題:私のモデルは、(私が検証し、簡単にするために、いくつかの無関係なコードを削除した)今のようなものです。私はowned_itemモデルでそれを参照するため、カプセル化を破って自分自身を繰り返します。実際に私のOwnedItemモデルで繰り返しコードを追加しますが、GameItemモデルのうち、その情報を得ることなく、ある
user.inventory.owned_items.item_type('Weapon').equipped
:どのように私は実際のような何かを行うことができることができますか?
お返事ありがとうございます:)私は実際にあなたが提案したものと同じアソシエーションを持つユーザーモデルを持っています(私はちょうどここには含まれていませんでしたが、ownedItemモデルでbelongs_toの使用を見ることができます)。私はまた、gameItemでhas_many owned_itemsを使ってみましたが、それでもuser.inventory.owned_items.game_items.item_type( 'Weapon')のようなことはできませんでした。アイテムが在庫や倉庫に置かれる可能性があるため、ここでは多態的な関連付けが必要でした。 – Spyros
あなたが提案している範囲は本当に便利です。返信には+1が必要ですが、私はまだownItemモデルのカプセル化と同じ問題があります。タイプを確認するためにgameItemモデルを含む別のスコープを作成する必要があります:/ – Spyros
通常、2つの異なるモデルを持つ理由は、それらが表すエンティティがそれを必要とするほど十分に異なるからです。 「インベントリ」が実際にデータの観点から「倉庫」と異なるわけではない場合、なぜそれらを位置標識属性を持つ単一のモデルに組み合わせることはできませんか?両者に若干の違いがある場合は、STIを使用しないでください。多形的な関連付けは、通常、何かが間違っているというサインです。 – tadman