Полиморфные отношения

#ruby-on-rails #relational-database #relationship #polymorphic-associations

#ruby-on-rails #реляционная база данных #отношения #полиморфные ассоциации

Вопрос:

моя проблема заключается в создании записи партнера внутри компании с полиморфной миграцией. Партнер происходит из моей коллекции пользователей.

Это моя форма

 <%= form_with(model: [@company, @partner], remote: true) do |f| %>
            <div class="form-group">
                <%= f.label 'Selecciona un socio' %>
                <%= f.collection_select(:partnershipable_id, User.all, :id, :name, {:prompt => 'Selecciona'}, {class: 'form-control'}) %>
            </div>
<% end %>
 

мои модели

приложение / модели / партнер

 class Partner < ApplicationRecord
  belongs_to :company
  belongs_to :partnershipable, polymorphic: true
end
 

приложение / модели / пользователь

 class User < ApplicationRecord
    has_many   :partners, as: :partnershipable
end
 

приложение / модели / компания

 class Company < ApplicationRecord
    has_many    :partners, as: :partnershipable
end
 

как должна выглядеть форма, чтобы правильно сохранить пользователя в качестве партнера.

Комментарии:

1. Не могли бы вы предоставить дополнительную информацию, например, об ошибке или ожидаемом поведении, на небольшом примере @Esteban Navarro

Ответ №1:

Если вы хотите выбрать полиморфную ассоциацию, вам также необходимо указать тип.

 <%= form_with(model: [@company, @partner], remote: true) do |f| %>
  <div class="form-group">
    <%= f.label 'Selecciona un socio' %>
    <%= f.collection_select(:partnershipable_id, User.all, :id, :name, {:prompt => 'Selecciona'}, {class: 'form-control'}) %>
    <%= f.hidden_input(:partnershipable_type, 'User') %>
  </div>
<% end %>
 

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

Комментарии:

1. Я только что понял, что в дополнение к User я должен иметь возможность добавить еще один тип «Company» Как мне это сделать, чтобы я мог взять тот или иной?

2. Создайте частичную и передайте локальную переменную (или две) вместо переменных экземпляра.