Mar*_*sen 7 many-to-many ruby-on-rails has-many-through 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
Run Code Online (Sandbox Code Playgroud)
我想在"区域"表单中添加和编辑关键字,因此我在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
Run Code Online (Sandbox Code Playgroud)
这按预期工作.
但是如果我将相同的关键字添加到两个不同的区域,关键字将只创建两次.
输入新关键字时(在"区域"表单中),我希望它自动创建与现有关键字的关系,或者创建新关键字(如果不存在).最好的方法是什么?
这是一个很晚的答案:)但我实际上在我的一个项目中遇到了类似的问题...我必须将关键字/标签添加到两个不同的模型,但他们可以共享它们。起初我和你一样,每次你将关键字/标签“附加”到模型时都会创建一条记录。
\n\n处理它的更好方法是使用标签系统。我通过结合两个非常好的宝石实现了一个非常简洁的系统:“acts-as-taggable-on”(https://github.com/mbleigh/acts-as-taggable-on)和“select2-rails” \'(https://github.com/argerim/select2-rails)
\n\n在我自己的项目中,我实际上做了与您类似的事情,并创建了一个模型,只是为了列出我想要的所有适当的关键字。但是“act-as-taggable-on”并不一定需要接受的关键字列表……因此您可以动态创建它们,并且它会自动处理重复项、计数等。
\n\n\'select2-rails\' 只是允许您拥有一个漂亮的界面来在一个字段中添加和删除关键字,而不是使用复选框、选择选项或文本输入,您必须在其中手动使用逗号或任何分隔符分隔字符串。
\n\n如果有人需要有关我如何实现所有内容的更多详细信息,我将非常乐意提供更多代码..但是它们的文档都非常简单!
\n\n编辑:嗯,我有一种感觉,有些代码实际上是有用的:)
\n\n在 Gemfile 中捆绑安装这两个 gem
\n\ngem \'acts-as-taggable-on\'\ngem \'select2-rails\'\nRun Code Online (Sandbox Code Playgroud)\n\n在您的Area模型中,您可以添加以下内容并执行类似的操作
class Area < ActiveRecord::Base\n # .. your code\n\n attr_accessible :area_keyword_list\n\n acts_as_taggable_on :area_keywords\nend\nRun Code Online (Sandbox Code Playgroud)\n\n在您的 ActiveAdmin 文件中
\n\nActiveAdmin.register Area do\n\n form do |f|\n f.inputs do\n # .. whatever fields you have\n f.input :area_keyword_list,\n :as => :select,\n :multiple => :true,\n :collection => # here either a list of accepted keyword..or just left open,\n :input_html => { :class => "multiple-select" }\n end\n end\nend\nRun Code Online (Sandbox Code Playgroud)\n\n而且 JSselect2非常简单......
$(".multiple-select").select2();\nRun Code Online (Sandbox Code Playgroud)\n\n瞧\xc3\xa0!
\n| 归档时间: |
|
| 查看次数: |
2440 次 |
| 最近记录: |