ruby-on-rails – 在Activeadmin中编辑多对多关系

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在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

我想在“区域”表单中添加和编辑关键字,因此我在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

这按预期工作.

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

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

解决方法

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

处理它的更好方法是使用标记系统.我通过结合两个非常好的宝石实现了一个非常整洁的系统:’act-as-taggable-on'(https://github.com/mbleigh/acts-as-taggable-on)和’select2-rails'(https://github.com/argerim/select2-rails)

在我自己的项目中,我实际上做了类似于你的事情并创建了一个模型,以便列出我想要的所有合适的关键字.但是’act-as-taggable-on’并不需要一个已接受的关键字列表……所以你可以动态创建它们,它会自动处理重复,计数等.

‘select2-rails’只允许你有一个很好的界面来添加删除一个字段中的关键字,而不是使用复选框,选择选项或文本输入,你必须用逗号或任何分隔符手动分隔你的字符串.

如果有人需要有关我如何实现所有内容的更多详细信息,我会非常乐意提供更多代码..但是这两个文档都非常简单!

编辑:嗯,我有一种感觉,一些代码实际上是有用的:)

Bundle在你的Gemfile中安装两个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

并在您的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

而select2的JS非常简单……

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

沃利亚!

猜你在找的Ruby相关文章