Редактирование отношений "многие ко многим" в Activeadmin

Я ищу способ редактирования / добавления ключевых слов, связанных со статьей, встроенной в Activeadmin.

Я определил простую настройку "многие ко многим":

class Area < ActiveRecord::Base
  has_many :area_keywords
  has_many :keywords, :through => :area_keywords
  accepts_nested_attributes_for :keywords, :reject_if => :all_blank, :allow_destroy => true
end

class AreaKeyword < ActiveRecord::Base
  belongs_to :area
  belongs_to :keyword
end

class Keyword < ActiveRecord::Base
  has_many :area_keywords
  has_many :areas, :through => :area_keywords
end

Я хотел бы добавить и отредактировать ключевые слова в форме En Area, поэтому я настраиваю это в Aciveadmin:

ActiveAdmin.register Area do
  form do |f|
    f.inputs "Area details" do
      f.input :title
      f.input :description
    end
    f.has_many :keywords do |k|
      if k.object.nil?
        k.input :word, :label => 'Keyword'
      else
        k.input :word, :label => k.object.word
        k.input :_destroy, :as => :boolean, :label => "delete"
      end
    end
  end
end

это работает, как ожидалось.

но если я добавлю одно и то же ключевое слово в две разные области, ключевое слово будет создано дважды.

при вводе нового сайта (в Area form), я хотел бы автоматически создать отношение к существующему ключевому слову или создать новое ключевое слово, если оно не существует. Как лучше всего поступить?

1 ответов


это довольно поздний ответ :) но я на самом деле столкнулся с подобной проблемой в одном из моих проектов...Мне пришлось добавить ключевые слова/теги в две разные модели, но они могли делиться ими. Сначала вы мне понравились, и это создавало запись для каждого раза, когда вы" прикрепляете " ключевое слово/тег к модели.

лучший способ справиться с этим-использовать систему тегов. И я достиг довольно аккуратной системы, объединив два действительно хороших драгоценных камня: "действует-как-taggable-on" (https://github.com/mbleigh/acts-as-taggable-on) и 'select2-rails' (https://github.com/argerim/select2-rails)

в моем собственном проекте я действительно сделал что-то похожее на вас и создал модель, чтобы иметь список всех соответствующих ключевых слов, которые я хотел. Но "act-as-taggable-on" не обязательно требует списка принятых ключевых слов...поэтому вы можете создавать их на лету, и он автоматически будет обрабатывать дубликаты, подсчеты так далее.

'select2-rails' просто позволяет вам иметь приятный интерфейс для добавления и удаления ключевых слов в одном поле, а не с помощью флажков, выбора параметров или ввода текста, где вам придется вручную отделить строку запятыми или любыми разделителями.

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

EDIT: Ну, у меня есть ощущение, что какой-то код действительно будет полезен:)

Bundle установите оба gem в свой Gemfile

gem 'acts-as-taggable-on'
gem 'select2-rails'

в своем Area модель, можно добавить следующее и сделать что-то вроде

class Area < ActiveRecord::Base
    # .. your code

    attr_accessible :area_keyword_list

    acts_as_taggable_on :area_keywords
end

и в вашем файле ActiveAdmin

ActiveAdmin.register Area do

    form do |f|
      f.inputs do
        # .. whatever fields you have
        f.input :area_keyword_list,
          :as => :select,
          :multiple => :true,
          :collection => # here either a list of accepted keyword..or just left open,
          :input_html => { :class => "multiple-select" }
      end
    end
end

и JS для select2 - это довольно просто ...

$(".multiple-select").select2();

вуаля !