Ruby on Rails с использованием тега check_box_tag с вложенными атрибутами и has_many

#ruby-on-rails #checkbox #nested-attributes #has-many-through

#ruby-on-rails #флажок #вложенные атрибуты #имеет много сквозных

Вопрос:

У меня есть 4 модели

 class Contract < ActiveRecord::Base

  has_many :addendums
  accepts_nested_attributes_for :addendums
end

class Addendum < ActiveRecord::Base

  belongs_to :contract
  has_many :addendum_services
  has_many :services, through: :addendum_services
end

class AddendumService < ActiveRecord::Base
  belongs_to :addendum
  belongs_to :service
end

class Service < ActiveRecord::Base
  has_many :addendum_services
end
  

Я использую вложенные атрибуты для создания дополнения через форму контракта, и это работает для всех атрибутов дополнения, но я также хочу, чтобы пользователь выбрал, используя check_box_tag , список используемых сервисов. Поскольку у Addendum нет атрибута для addendum_services , что я должен добавить к сильным параметрам Contract , чтобы принять список служб? Кроме того, как я могу сгенерировать список служб в форме? в настоящее время я использую это:

 <%= form_for(@contract) do |f| %>
  ...
  <%= f.fields_for :addendums do |addendums_form|%>
    <%= addendums_form.label 'Services'%><br>
    <% for serv in Service.all %>
    <%= check_box_tag "service[]", serv, @addendum.services.include?(serv) %>
    <%= serv %><br>
<% end %>
  

но это не работает…

Ответ №1:

Я использую аналогичный метод, но с документами и категориями.

Считайте документ сервисом

 class Document < ActiveRecord::Base
  has_many :categorisations
  has_many :categories, :through => :categorisations
  

Категория дополнение

 class Category < ActiveRecord::Base
  has_many :categorisations
  has_many :documents, :through => :categorisations
  

и дополнительный сервис для категоризации

 class Categorisation < ActiveRecord::Base
  belongs_to :document
  belongs_to :category
  

Примечание: Вам не хватает сквозного метода для службы

 has_many addendum, :through => :addendum_services 
  

Кроме того, мой флажок выглядит следующим образом;

   - Category.all.in_groups_of(3,false) do |category_list|
    %tr
      - for categories in category_list
        %td
          = check_box_tag "categorisation[category_ids][]", categories.id, @document.categories.include?(categories)
          %label= categories.title
  

Обратите внимание на «категоризацию [category_ids] []» вместо «service []» -> возможно, вам нужен «addendum_service[:service][]»?

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