2011-05-16 15 views
8

Estoy probando la nueva gema Rails http://activeadmin.info/ y está funcionando genial! Sin embargo, no encuentro ninguna documentación sobre cómo usarlo en las asociaciones. Por ejemplo:Usando Rails Gem Active Admin con Asociaciones

class Membership < ActiveRecord::Base 
    belongs_to :course 
    belongs_to :person 

class Course < ActiveRecord::Base 
    has_many :memberships 
    has_many :people, :through => :memberships 

class Person < ActiveRecord::Base 
    has_many :memberships 
    has_many :courses, :through => :memberships 

La tabla de unión de membresía también incluye algunos datos adicionales (es decir, asistencia). Intento mostrar la membresía con el curso y el nombre del estudiante, y permitir el filtrado/clasificación de esos nombres. Por lo que he encontrado, Active Admin no funciona en todas las asociaciones. ¿Alguien más ha tenido éxito al hacer eso o ha encontrado otra gema que sí lo tiene? ¡Muchas gracias!

Respuesta

5

ingredient.rb

class Ingredient < ActiveRecord::Base 
has_and_belongs_to_many :products, :join_table => :ingredients_products 
end 

product.rb

class Product < ActiveRecord::Base 
    has_and_belongs_to_many :ingredients, :join_table => :ingredients_products 
end 

no se olvide de las migraciones para unirse a la mesa! (: Identificación a falso)

class CreateProductsIngredients < ActiveRecord::Migration 
    def self.up 
    create_table :ingredients_products,:id => false do |t| 
     t.integer :product_id 
     t.integer :ingredient_id 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :products_ingredients 
    end 
end 

Defina ahora la forma en que actúa veAdmin recursos, reemplazar el valor predeterminado

ActiveAdmin.register Product do 
    form do |f| 
     f.inputs "Details" do 
      f.input :product_name 
      f.input :brand 
      f.input :ingredients # don't forget this one! 
     end 
end 
+0

Gracias por la respuesta, ¿lo obtuvieron de alguna documentación que me perdí? ¿Si es así, donde está? El problema es que si hago lo que muestra, obtendría una columna que diga "Ingrediente". No sé ustedes, pero eso no es exactamente lo que estoy buscando. ¿Puedo especificar una columna de la asociación para mostrar? – Tyler

+0

Hola Tyler, lo obtuve de la documentación de la gema de forma simple, parece que están usando esto. Y también creo que malentendí tu pregunta. No tengo la oportunidad de hacer lo que está intentando, pero yo mismo definiría un atributo virtual para el "Ingrediente" o anularía el atributo de nombre y terminaría haciendo algo como esto: 'def self.name " Ingrediente # {self .name} " end' No lo intenté yo mismo, así que no puedo prometerle si funcionará para usted –

+0

ActiveAdmin usa Formtastic (github.com/justinfrench/formtastic), no SimpleForm. Dentro del bloque 'form do', es prácticamente todo Formtastic haciendo el trabajo. Es probable que Formtastic también maneje las asociaciones, así que recomendaría revisar su documentación para ver algunos consejos :) – 6twenty

1

que acaba de comenzar el uso de esta joya mí mismo, y aunque no he tenido tiempo de mostrar información de asociación, así es como se crea un formulario para asociaciones:

form do |f| 
    f.inputs 

    f.has_many :associations do |association| 
    association.inputs 
    end 

    f.buttons 
end 

Eso le dará una forma básica con andamios.

+5

intenté con este método. pero una vez que agrego el bloque "f.has_many", hay un error "método indefinido' new_record? ' para nil: NilClass ". ¿Tienes alguna sugerencia? –

+0

Necesita agregar 'accepts_nested_attributes_for' en el modelo, entonces debería funcionar. –

4

He estado jugando con ActiveAdmin por un tiempo, he aquí cómo logré que las asociaciones trabajen en Índices y Formularios.

Acabo de adivinar algunas de las columnas de su modelo a continuación. También tenga en cuenta, en la forma. La sección 'persona' mostrará todas las columnas para editar, mientras que la sección 'curso' solo mostrará la columna especificada.

ActiveAdmin.register User do 
    index do 
     column :id 
     column :name 
     column :attendance 
     column :person do |membership| 
      membership.person.name 
     end 
     column :course do |membership| 
      membership.course.name 
     end 
     default_actions 
    end 

    form do |f| 
     f.inputs "Membership" do 
      f.input :name 
      f.input :created_at 
      f.input :updated_at 
     end 
     f.inputs :name => "Person", :for => :person do |person| 
      person.inputs 
     end 
     f.inputs :name => "Course", :for => :course do |course| 
      course.input :name 
     end 
     f.buttons 
    end 
end 

No he probado esto, pero debería poder aplicar estas ideas a su caso. Está trabajando para el mío.

Actualización: Acabo de volver a leer su pregunta y he notado que desea poder ordenar en la columna de la asociación. Acabo de verificar mi implementación y esto de hecho no está funcionando. Mi respuesta puede ser inútil para usted, pero lo dejaré aquí de todos modos (podría ayudar a alguien más).

0

ingredient.rb

class Ingredient < ActiveRecord::Base 
    has_and_belongs_to_many :products, :join_table => :ingredients_products 
end 

product.rb

class Product < ActiveRecord::Base 
    attr_accessible ingredient_ids 
    has_and_belongs_to_many :ingredients, :join_table => :ingredients_products 
end 

migration_xxx.rb

class CreateProductsIngredients < ActiveRecord::Migration 
    def self.up 
    create_table :ingredients_products,:id => false do |t| 
     t.integer :product_id 
     t.integer :ingredient_id 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :products_ingredients 
    end 
end 

productos.rb

ActiveAdmin.register Product do 
    form do |f| 
    f.inputs "Details" do 
     f.input :product_name 
     f.input :brand 
     f.input :ingredients 
    end 
    end 
    ... 
end