0

テーブルがitemsありcards、カードが に属しておりuseritem特定のユーザーのカードがある場合とない場合があります。

基本的な関連付けは次のように設定されます。

Class User
   has_many :cards

Class Item
   has_many :cards

Class Card
   belongs_to :user
   has_and_belongs_to_many :items

items_cardsまた、列item_idとを含む結合テーブルも作成しましたcard_id。特定のユーザー/アイテムのカードがあるかどうかを示すクエリを作成したいと思います。純粋な SQL では、これを非常に簡単に実現できます。

SELECT   count(id) 
FROM     cards 
JOIN     items_cards
ON       items_cards.card_id = cards.id
WHERE    cards.user_id = ?
AND      items_cards.item_id = ?

ActiveRecord を介してこれを行う方法についてのガイダンスを探しています。ありがとう!

4

1 に答える 1

1

にアイテムが@itemあり、ユーザーが にあると仮定する@userと、そのユーザーとそのアイテムにカードが存在する場合、これは「true」を返します。

Card.joins(:items).where('cards.user_id = :user_id and items.id = :item_id', :user_id => @user, :item_id => @item).exists?

何が起こっているかは次のとおりです。

Card.- Card モデルに関するクエリを作成しています。

joins(:items)- Rails は、それがサポートする関連タイプの結合をまとめる方法を知っています (通常は - 少なくとも)。関連するクエリも実行できるようにするために必要な結合を実行するように指示していますitems。これは、この場合、 になりJOIN items_cards ON items_cards.card_id = cards.id JOIN items ON items_cards.item_id = items.idます。

where('cards.user_id = :user_id and items.id = :item_id', :user_id => @user, :item_id => @item)- あなたの条件、純粋な SQL とほとんど同じです。Rails は:user_id、ハッシュ ( :user_id => @user) の値を使用して、コロン ( ) で指定した値を補間します。ActiveRecord オブジェクトを値として指定すると、Rails は自動的にそのオブジェクトの ID を使用します。ここでは、カードが指定したユーザーに属している結果のみが必要であり、必要なアイテムの行があると言っています。

.exists?- ActiveRecord オブジェクトのロードは非効率的です。そのため、何かが存在するかどうかだけを知りたい場合、Rails は時間を節約し、countベースのクエリを使用できます (SQL バージョンと同様)。または.countではなく、クエリが結果の数を返すようにしたい場合は、代わりに使用できるもあります。truefalse

于 2013-02-18T18:30:04.660 に答える