2016-01-07 62 views
1

我的项目是关于一个在线购物网站,使用Ruby on Rails购买手机。 现在我正在尝试为用户创建购物篮。为什么我无法更新has_many:通过rails 4关联

class User < ActiveRecord::Base 
    has_many :baskets 
    has_many :phones, :through => :baskets 
end 

class Phone < ActiveRecord::Base 
    has_many :baskets 
    has_many :users , :through => :baskets 
end 

class Basket < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :phone 
end 

当我更新这样的:

Phone.baskets.where(user_id:1).update(name:"abc") 

这是错误的! 我不知道为什么它不起作用。

+0

什么样的错误会给你带来什么? –

回答

1

这两个不同的东西,类与实例。

电话是一类,但篮子的关系属于该类的一个实例。

所以这样的事情应该让你使用的关系

instance_of_phone = Phone.first 
instance_of_phone.baskets.where(user_id: 1).update(name: 'abc') 

另一种方法是直接访问

Basket.find_by(user_id: 1, basket_id: 1).update(name: 'abc') 
+0

谢谢!有效 –

0

首先,作为@ Austio的回答中指出,你需要使用关联类的实例,而不是类本身。所以:<specific instance of Phone>.baskets而不是Phone.baskets。其次,如果您要更新具有相同属性的集合中的所有对象,则需要使用update_all。所以,假设phone是一个特定的电话对象。然后你会想:

phone.baskets.where(user_id:1).update_all(name:"abc")

update方法是设计用来更新一个单一对象的属性,或者用单独的属性的数组更新多个对象的数组散列:http://apidock.com/rails/ActiveRecord/Base/update/class