14

ActiveAdminアプリを開発していますが、ビジネスの列を「タイプ」で並べ替えたいと思います。残念ながら、私のコードは機能していません。これを実現するには、どのコードを使用する必要がありますか?これが私のコードです...

app/models/business.rb


class Business < ActiveRecord::Base   
     belongs_to :type

     attr_accessible :description, :email, :facebook, :foursquare, :google, :manager,
    :mobile, :name, :phone, :type_id, :url, :yelp 
end

app/models/type.rb


class Type < ActiveRecord::Base
  attr_accessible  :category
  has_many :businesses

  def to_s
    category
  end
end

app/admin/businesses.rb


ActiveAdmin.register Business, { :sort_order => :name_asc } do
  scope :joined, :default => true do |businesses|
    businesses.includes [:type]
  end
  index do
    column :name
    column :type, :sortable => 'businesses.type'
    column :manager
    column :email
    default_actions
  end
end

ありがとう!

4

5 に答える 5

21

このディスカッションによると:https ://github.com/gregbell/active_admin/pull/623 、スコープを使用したくない場合は、代わりにスコープ付きコレクションメソッドを使用できます。

ActiveAdmin.register Business, { :sort_order => :name_asc } do
  scope :all, :default => true

  index do
    column :name
    column :type, :sortable => 'types.category'
    column :manager
    column :email
    default_actions
  end

  controller do
    def scoped_collection
      end_of_association_chain.includes(:type)
    end
  end
end
于 2013-01-31T09:06:07.877 に答える
8

修繕

column :type, :sortable => 'types.category'

于 2012-06-24T20:57:45.470 に答える
4

はい、提供されたscoped_collectionEvgeniaはうまく機能します。また、複数の列の場合:

ActiveAdmin.register Foo do
  index do
    column :field_name_a, :sortable => 'association_a.field_name'
    column :field_name_b, :sortable => 'association_b.field_name'
  end
end

controller do
  def scoped_collection
    end_of_association_chain.includes([:association_a, :association_b])
  end
end
于 2013-02-15T02:47:44.063 に答える
4

これを行うことができます。

ここにスターというモデルがあります。星は人に属しています。Person.nameをStaradminインデックスに入れ、並べ替え可能にし、スコープで機能させ、フィルターを追加します。

まず、各スコープに結合モデルを追加する必要があります。この場合、スコープはall、category_subscriptions、person_subscriptionsの3つでした。スコープを宣言し、結合モデルをスコープに追加しています。

ActiveAdmin.register Star do
  [ :all, :category_subscriptions, :person_subscriptions ].each do |sym|
    scope(sym, :default => (sym == :all) ) do |stars|
      stars.includes [:person]
    end
  end
end

次に、結合モデルの人物名をスターインデックスに追加するには、次のようにします。

index do
  id_column
  column("Name", nil, :sortable => :"people.name") {|star| star.person.name}
  column("Email", nil, :sortable => :"people.email") {|star| star.person.email}
  default_actions
end

それを分析しましょう:

column("Name", nil, :sortable => :"people.name") {|star| star.person.name}
  • 最初のパラメーターは列のタイトルです。
  • 並べ替えと値をオーバーライドしているため、2番目は必要ありません。
  • :sortableは、アクティブな管理者に物事の並べ替え方法を指示します。これはSQLに組み込まれるため、テーブル名です。
  • このブロックは、アクティブな管理者に行の値として何を使用するかを指示します。

次に、いくつかのフィルターを追加します。これははるかに簡単です:

filter :person_name, :as => :string
filter :person_email, :as => :string

これで完了です。

于 2013-05-15T12:16:09.110 に答える
1

あなたのニーズに基づいて、これはソート、デフォルトのインデックス、フィルタリングのために機能する私の実装です:

ActiveAdmin.register Business do
  index do
    column :name
    column :type, :sortable => 'businesses.type'
    column :manager
    column :email
    default_actions
  end

  controller do
    def scoped_collection
      super.includes(:businesses)
    end
  end
end

アソシエーションのレベルがもう1つあるときにソートする方法がわからない場合に備えて、これは私がそれを処理する方法です。たとえば、次のようになります。

class TechResult < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  belongs_to :organization
end

class Organization < ActiveRecord::Base
  has_many :users
end

次に、tech_resultsセクションで、組織フィールドをレンダリングします。私の場合、値tech_result.user.organization.nameはこれらを分類する方法です。

ActiveAdmin.register TechResult do
  config.batch_actions = false
  permit_params :user_id

  preserve_default_filters!

  index do
    column :id
    column 'user', sortable: 'users.name' do |tr|
      tr.user.name
    end
    column 'organization', nil, sortable: 'organizations.name' do |tr|
      tr.user.organization.name.titleize if tr.user.organization
    end

  end

  controller do
    def scoped_collection
      super.includes(user: [:organization])
    end
  end
end
于 2018-10-08T20:46:28.147 に答える