Редактирование отношений "многие ко многим" в 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();
вуаля !