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