我正在开发rails(3.7.8)应用程序,并使用活动管理来管理ff模型的资源:
class AdminUser < ActiveRecord::Base
has_many :user_article_categories, :include => :article_categories
has_many :article_categories, :through => :user_article_categories,
:source => :admin_user
has_many :articles, :through => :user_article_categories,
:source => :admin_user
# ...
end
class UserArticleCategory < ActiveRecord::Base
belongs_to :admin_user
belongs_to :article_category
attr_accessible :admin_user_id, :article_category_id, :included
attr_accessor :included
after_find :set_included
private
def set_included
self.included = "1"
end
# ...
end
"包含"属性是基于提供的解决方案
class ArticleCategory < ActiveRecord::Base
has_many :user_article_categories, :include => :admin_users
has_many :admin_users, :through => :user_article_categories,
:source => :article_category
has_many :articles, :through => :user_article_categories,
:source => :article_category
# ...
end
但我似乎没有(正确地)为admin_user设置一个表单,这样创建一个新的admin_user就会将所有article_categories显示为复选框列表
而更新的持久admin_user会显示所有article_categories复选框,但会选中所有以前设置的文章类别,因此更新会删除未选中的复选框,并将新选中的复选添加到连接表中
对于admin/admin_users.rb,我按照如下方式创建表单,这是不起作用的,尽管它呈现正确,但将感谢任何帮助
form do |f|
if f.object.persisted? and current_admin_user.id == f.object.id
f.inputs "Admin Details" do
f.input :email
f.inputs :for => user_article_categories do |usr_art_catr|
usr_art_catr.input :article_category_id, :hidden
usr_art_catr.input :included
end
end
else
f.inputs "Admin Details" do
f.input :email
f.input :superuser, :label => "Super User Priveleges"
f.input :article_categories, :as => :check_boxes,
:collection => ArticleCategory.select("id, name")
end
end
f.buttons
end
实际上,显示所有article_categories的复选框列表,并在更新时为给定的admin_user检查所有已检查的文章类别。
Formtastic在为窗体对象呈现显示窗体时,通过调用窗体对象上提供的方法
f.input :method_to_be_called, :as => :checkboxes
哪个formtastic将其结果与通过
:collection => any_valid_ruby_object
但两者都应该返回相同的种类;array/array或hash/hash,通过对两个集合执行差异来确定应该检查哪些复选框。
formtastic调用的方法可以是admin_user上的一个实例方法,该方法查询联接表,以确定应该选中哪些复选框,并从相关的article_categories表中构建一个数组,或者在没有复选框时返回一个空数组。
这允许formtastic做正确的事情,至少在这种情况下是这样。此解决方案使user_article_categories(联接表)上的"included"属性变得多余!