2017-05-31 18 views
0

使用して、レール5.0:次のようにActiveRecordクエリとの関連付けからオブジェクトを取得するにはどうすればよいですか?

class User < ApplicationRecord 
    belongs_to :cart, {:optional => true} 
end 

class Phone < ApplicationRecord 
    has_many :cart_items 
end 

class CartItem < ApplicationRecord 
    belongs_to :cart, {:optional => true} #has cart_id as column 
    belongs_to :phone, {:optional => true} #has phone_id as column 
end 

class Cart < ApplicationRecord 
    has_one :user 
    has_many :cart_items 
end 

私のアプリが動作します。カート(Cart)を持つユーザー(User)があり、そのカートにはカートアイテム(CartItem)があります。それらのカート項目のそれぞれには、購入された電話機(Phone)を含むカートに​​関する情報があります。

私は現在、を受け取りました。user.cart.cart_itemsをループしています。params[:phone_id]のカートアイテムを返すと、それは更新され、ループから壊れます。

user_items = @user.cart.cart_items 
if user_items.any?{|x| x.phone_id == params[:phone_id].to_i} 

    user_items.each do |x| 
    if x.phone_id == params[:phone_id].to_i 
    x.update_attributes(:quantity_sold => params[:quantity].to_i) 
    break 
    end 
    end 

エンド

それは動作しますが、私はuser_items(@user.cart.cart_items)に関連付けられているすべての関連した携帯電話を見つけるために、データベースクエリを使用する方法があったかどうかを疑問に思いました。注意:@userはログインただ、現在のユーザーである

私は@user.cart.cart_items.where(:phone_id => 1)を使用してみました、それが働いたが、クエリ@user.cart.cart_items.where(:phone_id => 1).phoneを経由して、そこから電話を取得しようとしたとき、それはエラーundefined method 'phone' for #<CartItem::ActiveRecord_AssociationRelation:0x007fa38a461128>を返しました。

私は私の団体が)CartItemphonePhoneの=インスタンスのcart_item =インスタンス((cart_item.phones、およびphone.cart_items経由で正しく設定され、それらがうまく働いたかどうかをチェックする。

私ができる方法はありますアソシエーションからのデータベースクエリを使用して、電話番号がx(params)のすべてのユーザカートアイテム(@user.cart.cart_items)を検索する注:実際のオブジェクトが必要なので、電話のフィールド(例:@user.cart.cart_items.phone.brand_name)を調べることができます。

答えて

2

これは、関連するカートアイテムを提供します:

user_items_with_matching_phone.first.phone 

は(あなたが各ループで行った基本的にはどのような)最初の項目を更新するには:

user_items_with_matching_phone = @user.cart.cart_items.where(phone_id: x) 

は、最初の項目の電話を取得するにはしかし

user_items_with_matching_phone.first.update_attributes(quantity_sold: params[:quantity].to_i) 

を、あなたはuser_items_with_matching_phone.phoneを行うことはできませんuser_items_with_matching_phoneは単一のオブジェクトよりも配列に似ているためです。あなたは長さを取得することができますuser_items_with_matching_phone.size

+0

ありがとう...ちょうどあなたがアプリのために推薦するだろう好奇心。既存のSQLクエリまたは個別のデータベースクエリ(本質的にあなたが与えた答え)を反復する '.each'メソッド? – the12

+0

ほとんどの場合、SQLクエリはより効率的でなければなりません。この問題では、 'どこ(phone_id:x)'が各ループを使って一致するレコードを見つけるよりもはるかに効率的です。 – wesley6j

関連する問題