Ruby on rails 在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

我正在寻找一种在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
这正如预期的那样有效

但是如果我将同一个关键字添加到两个不同的区域,该关键字将只创建两次


当输入一个新关键字(在区域表单中)时,我希望它自动创建一个与现有关键字的关系,或者创建一个新关键字(如果它不存在)。最好的解决方法是什么?

这是一个很晚的答案:)但实际上我在我的一个项目中遇到了类似的问题……我不得不在两个不同的模型中添加关键字/标签,但他们可以共享它们。起初我和你一样,每次你“附加”一个关键字/标签到一个模型上,我都会创建一个记录

更好的处理方法是使用标签系统。通过结合两个非常好的宝石,我实现了一个非常简洁的系统:'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();