2012-06-21 20 views
12

Estoy desarrollando una aplicación ActiveAdmin, y quiero ordenar una columna de negocios por su "tipo". Lamentablemente, mi código no funciona. ¿Qué código debería usar para lograr esto? Aquí está mi código ...ActiveAdmin cómo ordenar la columna con asociaciones

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 

Gracias!

+0

¿Alguien? Todavía estoy frente a este obstáculo ... – Slicekick

Respuesta

8

FIJO

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

+2

En tu pregunta, pones la misma línea ... – dusan

+1

¿No lo entiendo? Esto es lo mismo que arriba? – cjm2671

18

acuerdo con esta discusión: https://github.com/gregbell/active_admin/pull/623, si no desea utilizar alcances, puede utilizar el método de recogida de ámbito lugar:

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

.. y funciona perfecto para mí :) –

+0

¡entonces deberías votar esto! :) – Rimian

+0

Puede tener que encadenar '.references (: type)' después de 'includes (: type)' para obtener una unión en versiones más recientes de ActiveRecord. – ahmacleod

4

Sí , el scoped_collection provisto por Evgenia funciona muy bien. También para más de una columna:

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 
3

Esto se puede hacer.

Aquí tengo un modelo llamado Star. Una estrella pertenece a una Persona. Voy a poner Person.name en el índice de administración Star, hacer que sea ordenable, hacer que funcione con ámbitos y agregar filtros.

Primero tiene que agregar el modelo de unión a cada uno de sus ámbitos. En este caso, tuve 3 ámbitos: all, category_subscriptions y person_subscriptions. Estoy declarando los alcances y añadiendo el modelo unirse a ellos:

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 

Ahora para añadir el nombre de la persona a partir del modelo unirse en mi índice estrella hago esto:

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 

Analicemos lo siguiente:

column("Name", nil, :sortable => :"people.name") {|star| star.person.name} 
  • el primer parámetro es el título de la columna.
  • El segundo no es necesario ya que estamos anulando el ordenamiento y el valor.
  • : ordenable le dice a Active Admin cómo ordenar la cosa. Este es el nombre de la tabla, ya que va a SQL.
  • El bloque le dice a Active Admin qué usar como un valor de fila.

Ahora para agregar algunos filtros.Esto es mucho más fácil:

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

y ya está.

Cuestiones relacionadas