Rails принадлежит_to_many

Я новичок в 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

Мне нужно иметь автомобиль, принадлежащий многим заказам и прокатам, в то время как в каждом бронировании и прокате может быть только один автомобиль.

class Car < ActiveRecord::Base
    # belongs_to_many :bookings
    # belongs_to_many :rentals
end

Как мне это сделать?

Ответ 1

Если автомобиль может иметь много заказов/аренды, но при бронировании/прокате может быть только один автомобиль, вы смотрите на классическую ситуацию belongs_to/has_many. Похоже, вы расстались с различием между belongs_to и has_one - это не грамматический, а вопрос о том, где находится столбец внешнего ключа в вашей базе данных.

  • belongs_to: "Я связан с одним из них, и у меня есть внешний ключ".
  • has_one: "Я связан с одним из них, и у него есть внешний ключ".
  • has_many: "Я связан со многими из них, и у них есть внешний ключ".

Обратите внимание, что has_one и has_many оба подразумевают там belongs_to на другой модели, так как это единственный вариант, когда модель "this" имеет внешний ключ. Также обратите внимание, что это означает, что has_one следует использовать только тогда, когда у вас есть отношения "один к одному", а не "один ко многим".

Учитывая это, я заменил has_one :car на belongs_to :car в ваших моделях аренды и бронирования и разместил has_many :bookings и has_many :rentals в вашей модели автомобиля. Также убедитесь, что в таблицах rentals и bookings есть столбец car_id; в таблице cars не должно быть столбцов, связанных с арендой или бронированием.

Ответ 2

Да, в Rails есть "принадлежность_many", вроде. Это немного больше работы, и вы не можете использовать с ним генераторы. Он назвал ассоциацию polymorphic.

Даже если вы можете сделать автомобиль, у вас много заказов и аренды, вы можете связать автомобиль, сделав его частью полиморфа, например rentable_vehicle. Ваш код будет выглядеть следующим образом:

class Car < ActiveRecord::Base
  belongs_to :rentable_vehicle, polymorphic: true
end

class Rental < ActiveRecord::Base
  belongs_to :client, dependent: :destroy
  has_many :cars, as: :rentable_vehicle
end

class Booking < ActiveRecord::Base
  belongs_to :client, dependent: :destroy
  has_many :cars, as: :rentable_vehicle
end

Ответ 3

Вы не можете сделать role_to_many. Самое близкое, что вы действительно можете получить, это has_and_belongs_to_many, но я не уверен, что вы хотите здесь - если у вас нет нескольких автомобилей на прокат/бронирование. Для получения полного объяснения просмотрите guide.

Я бы изменил его следующим образом:

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

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

class Car < ActiveRecord::Base
  has_many :bookings
  has_many :rentals
end

Кроме того, я не знаю, как ваша аренда связана с бронированием, но моя непосредственная мысль заключается в том, что между ними должно быть какое-то отношение, потому что вы, вероятно, не можете взять напрокат без бронирования, верно?