Ruby on rails 在Activeadmin中编辑多对多关系
我正在寻找一种在Activeadmin中内联编辑/添加与文章相关的关键字的方法 我定义了一个简单的多对多设置:Ruby on rails 在Activeadmin中编辑多对多关系,ruby-on-rails,many-to-many,activeadmin,has-many-through,Ruby On Rails,Many To Many,Activeadmin,Has Many Through,我正在寻找一种在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_de
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
这正如预期的那样有效
但是如果我将同一个关键字添加到两个不同的区域,该关键字将只创建两次
当输入一个新关键字(在区域表单中)时,我希望它自动创建一个与现有关键字的关系,或者创建一个新关键字(如果它不存在)。最好的解决方法是什么?这是一个很晚的答案:)但实际上我在我的一个项目中遇到了类似的问题……我不得不在两个不同的模型中添加关键字/标签,但他们可以共享它们。起初我和你一样,每次你“附加”一个关键字/标签到一个模型上,我都会创建一个记录 更好的处理方法是使用标签系统。通过结合两个非常好的宝石,我实现了一个非常简洁的系统:'acts-as-taggable-on'()和'select2-rails'() 在我自己的项目中,我实际上做了一些与您类似的事情,创建了一个模型,只是为了列出我想要的所有合适的关键字。但是“作为标记”并不一定需要一个接受关键字的列表……因此您可以动态创建它们,它将自动处理重复项、计数等 “select2 rails”只允许您拥有一个很好的界面来在一个字段中添加和删除关键字,而不是使用复选框、选择选项或文本输入,在这些地方您必须使用逗号或任何分隔符手动分隔字符串 如果有人需要更多关于我如何实现所有这些的细节,我将非常乐意提供更多的代码。。但是它们的文档都非常简单 编辑:嗯,我觉得有些代码实际上是有用的:) 捆绑安装两个gem到您的gem文件中
gem 'acts-as-taggable-on'
gem 'select2-rails'
在您的区域
模型中,您可以添加以下内容并执行以下操作
class Area < ActiveRecord::Base
# .. your code
attr_accessible :area_keyword_list
acts_as_taggable_on :area_keywords
end
而用于select2
的JS非常简单
$(".multiple-select").select2();
瞧 非常好的解决方案。谢谢分享!在我发布这个问题后,我已经使用了这两个gem,但是像这样同时使用它们是很有意义的。很好的解决方案,但我希望选择一些默认选项。假设在更新期间,我希望默认情况下选择我当前的孩子。我如何使用select2进行操作。
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
$(".multiple-select").select2();