如何通过与ActiveRecord查询的关联来获取对象?

时间:2017-05-31 21:13:18

标签: ruby-on-rails ruby-on-rails-5

使用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.phonesphone.cart_items正确设置,并且它们工作正常(cart_item = CartItem的实例和{{ 1}} = phone的实例。)

有没有办法可以使用关联中的数据库查询来查找电话ID为x(params)的所有用户购物车项目(Phone)?注意:我需要实际的对象,所以我可以查看电话的字段(即:@user.cart.cart_items。)

1 个答案:

答案 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

,您可以获得长度