Rails 3 has_and_belongs_to_many создает флажки в поле зрения - PullRequest
3 голосов
/ 22 сентября 2010

На основе следующих моделей

class Company < ActiveRecord::Base
  has_and_belongs_to_many :origins
end

class Origin < ActiveRecord::Base
  has_and_belongs_to_many :companies
end

Я хочу иметь в своем companies/_form набор флажков, представляющих все источники.

Не знаю, есть ли Company.new(params[:company]) in companies_controller#create может создать связь между компанией и выбранными источниками?

Я использую рельсы 3.0.0, какой лучший способ добиться этого?

спасибо за ваши идеи

Ответы [ 3 ]

10 голосов
/ 22 сентября 2010

habtm не является популярным выбором в наши дни, лучше использовать has_many: через, с надлежащей моделью соединения между ними.Это даст вам метод Company # origin_ids =, в который вы можете передать массив идентификаторов происхождения из вашей формы, чтобы установить все связанные источники для @company.Например,

<% current_origin_ids = @company.origin_ids %>
<% form_for @company do |f| %>
  <label>Name:<%= f.text_field :name %></label>
  <% Origin.all.each do |origin| %>
    <label><%= origin.name %>
      <%= check_box_tag "company[origin_ids][]", origin.id, current_origin_ids.include?(origin.id) %>
    </label>
  <% end %>
<% end %>

Кроме того, использование правильной модели соединения с соответствующим контроллером позволяет легко добавлять / удалять источники с помощью AJAX, используя вызовы создания / удаления для контроллера модели соединения.

3 голосов
/ 30 мая 2012

Я должен согласиться с @carpeliam, а has_many :through не должно быть выбором по умолчанию.HABTM работает нормально и требует меньше кода.Он также не ограничивает использование ajax и предоставляет установщик origin_ids, в который можно передать массив идентификаторов.Поэтому screencast , хотя с 2007 года все еще работает с Rails 3. Другой вариант, если использовать simple_form , таков:

= form.association :origins, :as => :check_boxes
2 голосов
/ 08 мая 2012

Лично я не верю, что многоплановость всегда лучше, это действительно зависит от вашей ситуации. Имеет много-через-лучше, если есть ЛЮБАЯ вероятность того, что ваша модель соединения сама имеет атрибуты. Это более гибко, чтобы изменить. Это удаляет магию некоторых соглашений Rails. Однако, если вам не нужен сквозной доступ, есть старый RailsCast для HABTM флажков , который может пригодиться.

...