通过double belongs_to table

时间:2016-06-23 19:49:22

标签: ruby-on-rails

如果我有这样的表:

class User < ActiveRecord::Base
  has_many :cars, through: :user_cars
end

class UserCar < ActiveRecord::Base
  belongs_to :user
  belongs_to :car

  validates_uniqueness_of :car, scope: :user
end


class Car < ActiveRecord::Base
  has_one :user_car, dependent: :destroy
  has_one :user, through: :user_cars
end

每个用户都可以拥有一辆汽车,而汽车只能属于一个用户。

我希望能够检索属于该用户的所有汽车,但user.cars不起作用。

我缺少什么?关系是否正确设置?

2 个答案:

答案 0 :(得分:0)

错误实际上是typo问题。

has_one :user, through: :user_cars

应该是:

has_one :user, through: :user_car

s关联

末尾没有through

答案 1 :(得分:0)

您必须先拥有常规关联才能拥有though关联。因此,您的User模型应如下所示:

class User < ActiveRecord::Base
  has_many :user_cars
  has_many :cars, through: :user_cars
end

这是因为当您说through: :somethings时,ActiveRecord正在寻找一个称为somethings的现有关联来传递。指定through时,将为其指定关联的名称,而不是模型或表的名称。

为证明这一点,您可以将user_cars的关联名称更改为belongings

class User < ActiveRecord::Base
  has_many :belongings, class_name: 'UserCar'
  has_many :cars, through: :belongings
end

我们的关联模型(UserCar)和表名称(user_cars)保持不变,但是由于我们更改了关联名称,因此必须更改through值的名称以匹配。

我知道我参加晚会很晚,但是我认为这对其他参加者会有所帮助。