2016-10-19 7 views
0

Я пытаюсь использовать полиморфные отношения с рельсами 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)

+0

Не могли бы вы устранить дополнительные ассоциации, написанные в моделях User and Hotel. пожалуйста, удалите следующее: «has_many: отели через:: бронирование» от пользователя и «принадлежит»: пользователям через:: бронирование »из отеля. а затем запустить запросы в консоли –

+0

Просто сделал это и все еще получил «Резервационная нагрузка (0,4 мс) SELECT' reservations'. * FROM 'reservations' WHERE' reservations'.'reservable_id' = 1 AND 'reservations'''reservable_type' = 'Пользователь' => # "проблема. – galettan

+0

Можете ли вы, пожалуйста, устранить это тоже из модели бронирования, принадлежит: пользователям принадлежит_to: отели –

ответ

0

Я предполагаю, что при просмотре кода вы написали дополнительные ассоциации поверх полиморфной ассоциации,

Чтобы создать полиморфную ассоциацию, достаточно всего лишь следующего кода. Не нужно передавать дополнительную ассоциацию внутри модели.Пожалуйста, реорганизовать свой код следующим образом, модель пользователя

class User < ApplicationRecord 
    has_many :reservations, as: :reservable 
end 

модель отеля:

class Hotel < ApplicationRecord 
     has_many :reservations, as: :reservable 
end 

Бронирование модели:

class Reservation < ApplicationRecord 
     belongs_to :reservable, polymorphic: true 
end 

И в файле миграции для бронирования, добавьте Reservable, как показано ниже

t.references :reservable, polymorphic: true 
+0

Хорошо, я получил первую ошибку, которую я делаю: Пользователь не подлежит регистрации. Пользователь has_many резервирует через отношения user_id, а не «reserveable_id». Мне нужно выяснить, какое отношение к пользователю -> отели, чтобы оно полностью работало. – galettan

+0

Он продолжает искать «2.2.3: 001> u = User.find (1) Пользовательская загрузка (0,5 мс) SELECT' users'. * FROM 'users' WHERE' users'.'id' = 1 LIMIT 1 = > # 2.2.3: 002> u.reservations Резервирование Загрузка (0,4 мс) ВЫБЕРИТЕ' Оговорки'. * ОТ 'Оговорки' WHERE' reservations'.'reservable_id' = 1 AND 'reservations' .'reservable_type' = 'Пользователь' => # ". Это не то поведение, которое я ищу. – galettan

0

Ok я отсортирован это:

Это модель бронирования:

class Reservation < ApplicationRecord 
     belongs_to :reservable, polymorphic: true 
end 

Это модель отель:

class Hotel < ApplicationRecord 
end 

И модель пользователя:

class User < ApplicationRecord 
    has_many :reservations 
end 

И как я получил результаты в консоли rails:

Running via Spring preloader in process 87452 
Loading development environment (Rails 5.0.0.1) 
2.2.3 :001 > u = User.find(1) 
    User Load (0.3ms) 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 :002 > u.reservations 
    Reservation Load (0.3ms) SELECT `reservations`.* FROM `reservations` WHERE `reservations`.`user_id` = 1 
=> #<ActiveRecord::Associations::CollectionProxy [#<Reservation id: 1, reservable_id: 1, reservable_type: "Hotel", user_id: 1, date_from: "2017-01-12 00:00:00", date_to: "2017-01-15 00:00:00", created_at: "2016-10-19 09:18:01", updated_at: "2016-10-19 09:18:01">]> 
2.2.3 :003 > u.reservations.first.reservable 
    Hotel Load (0.3ms) SELECT `hotels`.* FROM `hotels` WHERE `hotels`.`id` = 1 LIMIT 1 
=> #<Hotel id: 1, name: "HYATT REGENCY HOTEL", address: "3 Place du Général Kœnig", postal_code: "75017", town: "PARIS", created_at: "2016-10-19 08:36:55", updated_at: "2016-10-19 08:36:55"> 
Смежные вопросы