使用して、レール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>
を返しました。
私は私の団体が)CartItem
とphone
Phone
の=インスタンスのcart_item
=インスタンス((cart_item.phones
、およびphone.cart_items
経由で正しく設定され、それらがうまく働いたかどうかをチェックする。
私ができる方法はありますアソシエーションからのデータベースクエリを使用して、電話番号がx(params)のすべてのユーザカートアイテム(@user.cart.cart_items
)を検索する注:実際のオブジェクトが必要なので、電話のフィールド(例:@user.cart.cart_items.phone.brand_name
)を調べることができます。
ありがとう...ちょうどあなたがアプリのために推薦するだろう好奇心。既存のSQLクエリまたは個別のデータベースクエリ(本質的にあなたが与えた答え)を反復する '.each'メソッド? – the12
ほとんどの場合、SQLクエリはより効率的でなければなりません。この問題では、 'どこ(phone_id:x)'が各ループを使って一致するレコードを見つけるよりもはるかに効率的です。 – wesley6j