ActiveAdmin has_many通过编辑1k记录
我有我的模型Company
和Group
之间的关系设置has_many through
。这里的型号代码:ActiveAdmin has_many通过编辑1k记录
class Company < ActiveRecord::Base
has_many :company_groups
has_many :groups, through: :company_groups
accepts_nested_attributes_for :company_groups, allow_destroy: true
end
class Group < ActiveRecord::Base
has_many :company_groups
has_many :companies, through: :company_groups
accepts_nested_attributes_for :company_groups, allow_destroy: true
end
class CompanyGroup < ActiveRecord::Base
belongs_to :company
belongs_to :group
validates_uniqueness_of :company_id, :scope => :group_id
end
我的问题是,在我的company_groups
表中有900条记录为group_id=1
现在,如果我给选项编辑的组,它会尝试加载所有900记录一气呵成。
这是我的/app/admin/group.rb
文件:
form do |f|
return unless current_admin_user.super_admin?
f.semantic_errors *f.object.errors.keys
f.inputs 'Group Information' do
f.input :name
end
f.has_many :company_groups do | company_group |
if !company_group.object.nil?
company_group.input :_destroy, :as => :boolean, :label => "Destroy?"
end
if company_group.object.new_record?
company_group.input :company, :label => 'Company', :as => :select, :collection => @companies
else
company_group.input :company, :input_html => { :readonly => "readonly", :value => company_group.object.company.name }, :as => :string
end
end
f.actions
end
页面正在采取地狱大量的时间来加载,所以我已经启用了检查,如果company_group
是不是一个新的对象,显示在文本框中company.name
(以只读形成)。虽然,这会使页面加载时间达到< 25秒,但我仍然认为这不是一次加载这些记录的好习惯(因为这可能会挂起浏览器)
我会将我的问题分成两部分部分:
从优化的角度来看,编辑这些记录(搜索/延迟加载等)的最佳方式是什么?如果有人已经做了这样的事情或类似的功能,你可以分享代码片段来实现
从ActiveAdmin的角度来看,ActiveAdmin是否提供了一种方便的方式来批量编辑记录?
任何帮助将不胜感激!
最佳, 普尼特
编辑:05 /四月/ 17
下面是我在做什么编辑1K记录:
- 允许添加|关于公司新的编辑组/编辑页面。
- 允许通过Group show/edit页面上的按钮添加公司。
- 允许通过组显示页面从组中删除公司。
- CODE:对于公司我的模型代码将保持原样
- CODE:为组我的模型代码将保持原样
这里是我完整的代码片段:
class CompanyGroup < ActiveRecord::Base
validates_uniqueness_of :company_id, :scope => :group_id
belongs_to :company
belongs_to :group
before_save :ensure_settings
protected
def ensure_settings
errors.add(:field_name_2, "You are not allowed to change this field when #{company.boolean_field_name} is set to TRUE") and return false if company.boolean_field_name && field_name_2_changed?
end
end
这是我的文件/app/admin/company.rb
ActiveAdmin.register Company do
form do |f|
f.semantic_errors
f.inputs do
f.input :field_1
f.input :boolean_field_name
f.has_many :company_groups do | company_group |
company_group.input :group
company_group.input :field_name_2, as: :radio, collection: [ ['Yes', true], ['No', false] ]
end
end
end
show do
row :field_1
row :boolean_field_name
panel "Groups" do
table_for company.company_groups do
column "Group Name" do | company_group |
company_group.group.name
end
column "Field Name 2" do |company_group|
company_group.group.field_name_2
end
end
end
end
end
这是我的文件/app/admin/group.rb
ActiveAdmin.register Group do
config.action_items[0] = ActiveAdmin::ActionItem.new :show, only: [:show, :edit] do
link_to 'Add Company to Group', new_company_group_path(group_id: group.id)
end
form do |f|
f.semantic_errors *f.object.errors.keys
f.inputs do
f.input :name
unless f.object.company_groups.any?
f.has_many :company_groups do | company_group |
company_group.input :company, as: :select
company_group.field_name_2, as: :radio, collection: [ ['Yes', true], ['No', false] ]
end
end
end
f.actions
end
show do
attributes_table do
row :name
end
panel "Companies" do
table_for group.company_groups do
column "" do |company_group|
link_to("Edit", edit_company_group_path(company_group, group_id: group.id)) + " | ".html_safe + (link_to "Delete", company_group_path(company_group), method: :delete, data: { confirm: "Are you sure you want to delete this company from this group?" })
end
end
end
end
end
最后我/app/models/company_group.rb
文件:
ActiveAdmin.register CompanyGroup do
form do |f|
f.semantic_errors *f.object.errors.keys
f.inputs do
f.input :group
f.input :company
f.input :field_name_2, as: :radio, collection: [ ['Yes', true], ['No', false] ]
end
end
controller do
def create
create! do |format|
format.html { redirect_to(new_company_group_path(group_id: @company_group.group_id)) }
end
end
def update
update! do |format|
format.html { redirect_to(group_path(@company_group.group)) }
end
end
end
end
但现在我正在给不同的问题:
- 我对
company_group.rb
定制模型验证不工作。这意味着,每当我试图创建/更新公司记录和boolean_field_name
设置为TRUE
和field_name_2
得到更改,我没有得到(a)错误消息,(b)虽然更新值field_name_2
未在数据库中更新,但我是甚至没有停止创建/更新操作。它带我回到了演出页面。 - 当我试图更新编辑
company_group
对象时(通过组显示/编辑页面),情况也是如此。我期望留在company_group的POST/PATCH页面上,并显示错误消息,但我正在重定向。是否因为create
和update
的自定义操作?
编辑:05 /四月/ 17
我甚至已经尝试通过检查valid?
为company_group
记录:
def create
create! do |format|
if resource.valid?
format.html { redirect_to(new_company_group_path(group_id: @company_group.group_id)) }
end
end
end
def update
if resource.valid?
update! do |format|
format.html { redirect_to(group_path(@company_group.group)) }
end
end
end
,但没有运气!
我这里还有日志:
Started PATCH "/company_groups/877" for ::1 at 2017-04-05 16:51:41 +0530
Processing by CompanyGroupsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"T7jMdOHQygqiX5RSsEkfD1l0h5Q+dpaNrmJlhtiPhpaxen6AyBcv4yD7xAy2GefYpGX0Bvgx4oD7vTMsfIl6fw==", "company_group"=>{"group_id"=>"6", "company_id"=>"623", "field_name_2"=>"true"}, "commit"=>"Update Company group", "id"=>"877"}
[1m[36mCompanyGroup Load (0.3ms)[0m [1mSELECT "company_groups".* FROM "company_groups" WHERE "company_groups"."id" = $1 LIMIT 1[0m [["id", 877]]
[1m[35m (0.3ms)[0m BEGIN
[1m[36mCompanyGroup Exists (0.5ms)[0m [1mSELECT 1 AS one FROM "company_groups" WHERE ("company_groups"."company_id" = 623 AND "company_groups"."id" != 877 AND "company_groups"."group_id" = 6) LIMIT 1[0m
[1m[35mCompany Load (0.3ms)[0m SELECT "companies".* FROM "companies" WHERE "companies"."id" = $1 ORDER BY companies.name LIMIT 1 [["id", 623]]
[1m[36m (0.3ms)[0m [1mROLLBACK[0m
[1m[35mCompanyGroup Exists (0.5ms)[0m SELECT 1 AS one FROM "company_groups" WHERE ("company_groups"."company_id" = 623 AND "company_groups"."id" != 877 AND "company_groups"."group_id" = 6) LIMIT 1
[1m[36mGroup Load (0.3ms)[0m [1mSELECT "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT 1[0m [["id", 6]]
Redirected to http://localhost:3000/superadmin/groups/6
Completed 302 Found in 94ms (ActiveRecord: 7.8ms)
最后,我把它通过改变before_save
回调validate
解决。从5月/ 4月更新的帖子将继续保持不变,我所做的唯一更改是/app/models/company_group.rb
文件。
class CompanyGroup < ActiveRecord::Base
validates_uniqueness_of :company_id, :scope => :group_id
belongs_to :company
belongs_to :group
validate :ensure_settings
protected
def ensure_settings
errors.add(:field_name_2, "You are not allowed to change this field when #{company.boolean_field_name} is set to TRUE") and return false if company.boolean_field_name && field_name_2_changed?
end
end
就是这样。感谢我的一位朋友向我暗示了这一点。 :)
并且您每次打开此表单时都会添加/删除公司? – NeverBe
我接受任何建议。我能想到的一件事是..允许一个编辑链接组'show'行动,这将导致用户编辑'has_many通过'对象 但如果没有被接受,那么: - 有没有一种方法,我可以在group show action上编辑'company_group'对象? –
确定你可以,只需在那里添加表格,但如果你有1K记录......甚至很难显示它们。加快显示视图,您可以添加分页显示Ajax,这是不适合编辑 – NeverBe