Я пытаюсь использовать полиморфные отношения с рельсами 5.Рельсы полиморфные отношения
Мне трудно понять, как закончить мои отношения.
У меня есть пользователи, которые могут принять заказ для гостиниц, ресторанов и т.д.
Моя цель состоит в том, чтобы получить гостиницы имя и оговорки при вызове/Users/{ID} через API.
Вот моя модель Пользователь:
class User < ApplicationRecord
has_many :reservations, as: :reservable
has_many :hotels, through: :reservations
end
Моя модель Отель:
class Hotel < ApplicationRecord
has_many :reservations, as: :reservable
belongs_to :users, through: :reservations
end
Ресервирование модель:
class Reservation < ApplicationRecord
belongs_to :reservable, polymorphic: true
belongs_to :users
belongs_to :hotels
end
Миграции:
Пользователь:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :first_name
t.string :last_name
t.string :email
t.timestamps
end
end
end
Бронирование:
class CreateReservations < ActiveRecord::Migration[5.0]
def change
create_table :reservations do |t|
t.belongs_to :hotel, index: true
t.belongs_to :user, index: true
t.datetime :date_from
t.datetime :date_to
t.timestamps
end
end
end
class ReservationPolymorphism < ActiveRecord::Migration[5.0]
def change
rename_column :reservations, :hotel_id, :reservable_id
change_column :reservations, :reservable_id, polymorphic: true
add_column :reservations, :reservable_type, :string
end
end
Отель:
class CreateHotels < ActiveRecord::Migration[5.0]
def change
create_table :hotels do |t|
t.string :name
t.string :address
t.string :postal_code
t.string :town
t.timestamps
end
end
end
Я просто 1 строку в моей таблице оговорок:
mysql> select * from reservations;
+----+---------------+-----------------+---------+---------------------+---------------------+---------------------+---------------------+
| id | reservable_id | reservable_type | user_id | date_from | date_to | created_at | updated_at |
+----+---------------+-----------------+---------+---------------------+---------------------+---------------------+---------------------+
| 1 | 1 | Hotel | 1 | 2017-01-12 00:00:00 | 2017-01-15 00:00:00 | 2016-10-19 09:18:01 | 2016-10-19 09:18:01 |
+----+---------------+-----------------+---------+---------------------+---------------------+---------------------+---------------------+
У меня нет никакого результата при использовании API ,
Вот что я получаю, используя Rails консоль:
2.2.3 :001 > thomas = User.find(1)
User Load (0.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> #<User id: 1, first_name: "Thomas", last_name: "Dupont", email: "[email protected]", created_at: "2016-10-18 21:12:12", updated_at: "2016-10-18 21:12:12">
2.2.3 :003 > thomas.reservations
Reservation Load (0.3ms) SELECT `reservations`.* FROM `reservations` WHERE `reservations`.`reservable_id` = 1 AND `reservations`.`reservable_type` = 'User'
2.2.3 :005 > thomas.hotels
NameError: uninitialized constant User::Hotels
Так что я могу видеть, что я сделать основную ошибку с рельсов отношений и полиморфизма, но я действительно не могу найти, где я ошибаюсь.
Я думаю, что совершил ошибку. я предположил, полиморфизм может быть использован для загрузки других моделей и их таблиц (например, «morphTo» с красноречивым/Laravel), в то время как это просто загрузить модель, которая не имеет никакого представления данных (как описано в этом посте: https://robots.thoughtbot.com/using-polymorphism-to-make-a-better-activity-feed-in-rails)
Не могли бы вы устранить дополнительные ассоциации, написанные в моделях User and Hotel. пожалуйста, удалите следующее: «has_many: отели через:: бронирование» от пользователя и «принадлежит»: пользователям через:: бронирование »из отеля. а затем запустить запросы в консоли –
Просто сделал это и все еще получил «Резервационная нагрузка (0,4 мс) SELECT' reservations'. * FROM 'reservations' WHERE' reservations'.'reservable_id' = 1 AND 'reservations'''reservable_type' = 'Пользователь' => # "проблема. –
galettan
Можете ли вы, пожалуйста, устранить это тоже из модели бронирования, принадлежит: пользователям принадлежит_to: отели –