Rails belongs_to_many

Kam*_*nek 14 activerecord ruby-on-rails associations

我是Rails的初学者,我有ActiveRecords关联的问题.
我正在创建简单的汽车租赁服务,我做了以下协会:

class Client < ActiveRecord::Base
  has_many :rentals
  has_many :bookings
  has_many :cars, :through => :rentals
  has_many :cars, :through => :bookings
end

class Rental < ActiveRecord::Base
  belongs_to :client, dependent: :destroy
  has_one :car
end

class Booking < ActiveRecord::Base
  belongs_to :client, dependent: :destroy
  has_one :car
end
Run Code Online (Sandbox Code Playgroud)

我需要的是拥有属于许多预订和租赁的汽车,而每个预订和租赁只能分配一辆汽车.

class Car < ActiveRecord::Base
    # belongs_to_many :bookings
    # belongs_to_many :rentals
end
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

Dig*_*ora 36

如果一辆车可以有很多预订/租赁,但预订/租赁只能有一辆车,你会看到一个经典belongs_to/ has_many情况.它看起来像你被绊倒了通过区分belongs_tohas_one-它不是一个语法之一,但那里的外键列位于数据库的问题.

  • belongs_to:"我与其中一个相关,我有外键."
  • has_one:"我与其中一个相关,它有外键."
  • has_many:"我与其中很多人有关系,他们有外键."

请注意,has_one并且has_many两者都暗示belongs_to在另一个模型上有一个,因为这是"this"模型具有外键的唯一选项.另请注意,has_one只有在您具有一对一关系而非一对多关系时才应使用此方法.

考虑到这一点,我将代替has_one :carbelongs_to :car您的服务都和预订模型,以及地方has_many :bookingshas_many :rentals你的车的模型.还要确保您的rentalsbookings表有car_id列; 您的cars表格中不应包含与租赁或预订相关的列.

  • @Ziggy,没有涉及存储多个外键的模型的选项,因为使用标准SQL列类型实际上不可能.如果你有多对多关系(例如帖子有很多标签,标签有很多帖子),它应该用[`has_many:through`配置]中的第三个模型(例如标签)来表示(http:/ /guides.rubyonrails.org/association_basics.html#the-has-many-through-association). (2认同)