如何在Ruby on Rails中以n:m关系访问引用表?

时间:2011-12-09 23:10:07

标签: ruby-on-rails many-to-many rails-activerecord

我有一个像这样的数据库:

    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>

所以我觉得我很容易做错......

当我知道如何访问第三个表时,我必须以这种方式进行,我只能为用户获得结果,而不仅仅是第一个条目,也许你们可以帮助我。谢谢!

2 个答案:

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

  • :通过定义快捷方式
  • :inverse_of定义了一个方法(关联),它表示当前模型:class_name model
  • :class_name定义应该由哪个模型表示:user_cars
  • :foreign_key告诉目标模型表中的哪一列代表当前模型(在表user_cars中(或者users_cars,取决于你如何定义关联,我认为在这个例子中应该是user_cars ..和{{1}的users_cars })

有关这些的详细信息,请参阅上面的链接。