我有一个像这样的数据库:
users
-id
user_cars
-user_id
-car_id
cars
-id
-model
-color
因此,用户可以拥有多辆汽车,并且有关汽车的详细信息位于大型汽车中。我还用关系创建了模型。
class User
has_many :user_cars
class User_car
belongs_to :user
belongs_to :cars
class Car
has_many :user_cars
现在我想访问一个用户的所有汽车的信息。我的第一种方法是从汽车表中获取至少一个信息(即颜色)。
我试过这个,就像访问中间表的例子一样:
@user_id = current_user.user_cars.find(1).user_id
作品!但是当我尝试访问汽车表时,我总是会收到错误。
@color = current_user.user_cars.cars.find(1).color
undefined method `cars' for #<ActiveRecord::Relation:0xaf92e8c>
所以我觉得我很容易做错......
当我知道如何访问第三个表时,我必须以这种方式进行,我只能为用户获得结果,而不仅仅是第一个条目,也许你们可以帮助我。谢谢!
答案 0 :(得分:1)
顺便提一下你的例子中的问题是belongs_to应该是单数的。此外,您的订单错了。
@color = current_user.user_cars.find_by_car_id(1).car.color
您应该重写此内容以使用has_many through关联:
class User
has_many :user_cars
has_many :cars, :through => :user_cars
class UserCar
belongs_to :user
belongs_to :car
然后您可以通过以下方式访问汽车:
current_user.cars
通过做的颜色:
@color = current_user.cars.find_by_car_id(1).color
修改强>
经过一些调试后,发现Car模型有一个class属性。类是ruby中的保留字。注意命名属性!
答案 1 :(得分:1)
没有has_many:通过关联:
@color = current_user.user_cars.where(:car_id => 1).first.color
与他们一起:
class User < ActiveRecord::Base
has_many :user_cars, :foreign_key => :user_id, :class_name => "UserCar", :inverse_of => :user
has_many :cars, :through => :user_cars
end
class UserCar < ActiveRecord::Base
belongs_to :user
belongs_to :car
end
class Car < ActiveRecord::Base
has_many :user_cars, :foreign_key => :car_id, :class_name => "UserCar", :inverse_of => :car
has_many :cars, :through => :user_cars
end
@color = current_user.cars.find(1).color
http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association
有关这些的详细信息,请参阅上面的链接。