2017-03-27 6 views
1

私のモデルCompanyGroupの間に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 

私が持っている問題は、私はグループを編集するためのオプションを与えていた場合、それはすべて900をロードしようと、私のcompany_groups表に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秒にしますが、これは多くのレコードを一度にロードするのは良い方法ではないと私はまだ思っています(これもブラウザをハングアップする可能性があるため)

私は2つに質問を分岐します部品:

  1. 最適化の観点から、これらのレコードを編集する最良の方法は何ですか(検索/レイジー読み込みなど)?もし誰かがこの機能を以前に行ったことがあるのであれば、コードスニペットを共有することができますか?

  2. ActiveAdminでは、バッチでレコードを編集する便利な方法はありますか?

ご協力いただければ幸いです!

ベスト、 Puneet

EDIT:05/4月/ 17

は、ここで私は1kのレコードを編集することがやっているものです:追加許可

  1. を|新会社の編集グループ/ページを編集します。
  2. グループの追加/編集ページのボタンを使用してグループに追加することを許可します。
  3. グループの編集ページをグループから削除することを許可します。
  4. CODE:
  5. 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)) + "&nbsp;|&nbsp;".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ため

  1. マイカスタムモデルの検証が動作していません。つまり、boolean_field_nameTRUEに設定され、field_name_2が変更された場合、更新された値field_name_2はDBでは更新されませんが、(a)エラーメッセージは表示されません。作成/更新アクションで停止しませんでした。ショーページに戻ります。
  2. 編集company_groupオブジェクトを(グループの表示/編集ページから)更新しようとしている場合も同じです。私はエラーメッセージでcompany_groupのPOST/PATCHページにとどまると予想しますが、リダイレクトされています。これは、createupdateのカスタマイズ操作のためですか?

EDIT

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 

しかし運:05/4月/ 17

私もでcompany_groupレコードのvalid?をチェックしようとしました!

Here'reログ:

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) 
+0

あなたはこのフォームを開くたびに会社を追加/削除しますか? – NeverBe

+0

私は何か提案があれば公開しています。私が考えることができる1つのことは、 'show_action'グループの編集リンクを許可して、ユーザーに' has_many through'オブジェクトを編集させます。 それが受け入れられなかった場合: - できることはありますか?グループショーアクションで 'company_group'オブジェクトを編集しますか? –

+0

確かに、そこにフォームを追加することはできますが、もし1kレコードがあれば...それらを表示することさえ困難です。ビューを表示する速度を上げるために、編集に適していない表示にページ番号付きのajaxを追加することができます – NeverBe

答えて

0

は最後に、私はそれがvalidatebefore_saveコールバックを変更することで解決し得ます。更新された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 

これだけです。私にこれを提案してくれた友人のおかげです。 :)

関連する問題