使用Rails 5.0:
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
我的应用程序的工作原理如下。有些用户(User
)有推车(Cart
),并且在这些购物车中有推车商品(CartItem
)。在每个购物车项目中都有关于购物车的信息,包括购买的电话(Phone
)。
我目前正在使用.each
循环来遍历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>
。
我检查了我的关联是否通过(cart_item.phones
和phone.cart_items
正确设置,并且它们工作正常(cart_item
= CartItem
的实例和{{ 1}} = phone
的实例。)
有没有办法可以使用关联中的数据库查询来查找电话ID为x(params)的所有用户购物车项目(Phone
)?注意:我需要实际的对象,所以我可以查看电话的字段(即:@user.cart.cart_items
。)
答案 0 :(得分:2)
这为您提供了相关的CartItems:
user_items_with_matching_phone = @user.cart.cart_items.where(phone_id: x)
获取第一个项目的电话:
user_items_with_matching_phone.first.phone
更新第一项(基本上是你在每个循环中所做的):
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