2012-06-21 19 views
12

Sto sviluppando un'app ActiveAdmin e desidero ordinare una colonna di attività in base al loro "tipo". Sfortunatamente il mio codice non funziona. Quale codice dovrei usare per realizzare questo? Ecco il mio codice ...ActiveAdmin come ordinare la colonna con le associazioni

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 

Grazie!

+0

Chiunque? Sto ancora affrontando questo posto di blocco ... – Slicekick

risposta

8

FISSO

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

+2

Nella tua domanda hai messo la stessa linea ... – dusan

+1

Non capisco? È lo stesso di sopra? – cjm2671

18

secondo questa discussione: https://github.com/gregbell/active_admin/pull/623, se non si desidera utilizzare gli ambiti, è possibile utilizzare il metodo di raccolta ambito invece:

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

.. e funziona perfettamente per me :) –

+0

allora dovresti votare a favore! :) – Rimian

+0

Potrebbe essere necessario concatenare '.references (: type)' dopo 'includes (: type)' per ottenere un join nelle versioni più recenti di ActiveRecord. – ahmacleod

4

Sì , la raccolta scoped fornita da Evgenia funziona alla grande. Anche per più di una colonna:

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

Questo può essere fatto.

Qui ho un modello chiamato Stella. Una stella appartiene a una persona. Inserirò il Person.name nell'indice admin Star, renderlo ordinabile, farlo funzionare con gli ambiti e aggiungere filtri.

Prima di tutto è necessario aggiungere il modello di join a ciascuno dei propri ambiti. In questo caso avevo 3 ambiti: tutti, category_subscriptions e person_subscriptions. Sto dichiarando gli scopi e aggiungendo il modello di unirsi a loro:

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 

ora per aggiungere il nome della persona dal modello unire nel mio indice stella faccio questo:

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 

Analizziamo che:

column("Name", nil, :sortable => :"people.name") {|star| star.person.name} 
  • il primo parametro è il titolo della colonna.
  • Il secondo non è necessario poiché stiamo sovrascrivendo l'ordinamento e il valore.
  • : ordinabile indica all'Amministratore attivo come ordinare la cosa. Questo è il nome della tabella, poiché sta andando in SQL.
  • Il blocco indica all'Amministratore attivo cosa utilizzare come valore di riga.

Ora aggiungere alcuni filtri.Questo è molto più semplice:

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

E il gioco è fatto.

Problemi correlati