2011-05-16 6 views
8

J'essaie la nouvelle gemme Rails http://activeadmin.info/ et ça marche très bien! Cependant, je ne trouve aucune documentation sur la façon de l'utiliser dans les associations. Par exemple:Utilisation de Rails Gem Active Admin avec les associations

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 

Les membres table de jointure comprend des données supplémentaires ainsi (ex: participation). J'essaye de montrer l'adhésion avec le nom de cours et d'étudiant - et permettez le filtrage/le tri sur ces noms. Pour autant que j'ai trouvé, Active Admin ne fonctionne pas à travers les associations. Quelqu'un d'autre a-t-il réussi à le faire ou a-t-il trouvé une autre gemme? Merci beaucoup!

Répondre

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 

ne pas oublier les migrations de la table (rejoindre: id = false)

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 

Maintenant, définissez le formulaire dans votre Acti ressource veAdmin, remplacer la valeur par défaut

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

Merci pour la réponse - avez-vous reçu ceci d'une documentation que j'ai manquée? Si oui, où est-ce? Le problème est que si je fais comme vous le montrez, j'obtiendrais une colonne qui dit "Ingrédient". Je ne sais pas pour vous - mais ce n'est pas tout à fait ce que je cherche. Puis-je spécifier une colonne de l'association à afficher? – Tyler

+0

Salut Tyler, je l'ai obtenu à partir de la documentation simple de gemme de forme, il semble qu'ils utilisent ceci. Et je pense aussi que j'ai mal compris votre question. Je n'ai pas eu la chance de faire ce que vous essayez, mais je définirais moi-même un attribut virtuel pour le "Ingrédient" ou remplacerais l'attribut name en finissant par quelque chose comme ceci: 'def self.name " Ingrédient # {self .name} " end' Je ne l'ai pas essayé moi-même donc je ne peux pas promettre si cela fonctionnera pour vous –

+0

ActiveAdmin utilise Formtastic (github.com/justinfrench/formtastic), pas SimpleForm. Dans le bloc 'form do', c'est à peu près tout Formtastic qui fait le travail. Il est probable que Formtastic gère également les associations, donc je vous recommande de consulter leur documentation pour quelques pointeurs :) – 6twenty

1

Je viens de commencer à utiliser ce petit bijou moi-même, et alors que je ne l'ai pas eu l'occasion de montrer l'information d'association, voici comment vous créez un formulaire pour les associations:

form do |f| 
    f.inputs 

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

    f.buttons 
end 

Cela vous donnera une forme de base avec un échafaudage.

+5

J'ai essayé cette méthode. mais une fois que j'ajoute le bloc "f.has_many", il y a une erreur "méthode non définie' new_record? " pour néant: NilClass ". Avez-vous une suggestion? –

+0

Vous devez ajouter 'accept_nested_attributes_for' dans le modèle, alors cela devrait fonctionner. –

4

Je joue avec ActiveAdmin depuis un moment maintenant, voici comment j'ai réussi à faire fonctionner les associations dans Indexes and Forms.

Je viens juste de deviner certaines de vos colonnes de modèles ci-dessous. Notez également, dans le formulaire. La section 'personne' affichera toutes les colonnes à éditer, tandis que la section 'cours' affichera simplement la colonne spécifiée.

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 

Je n'ai pas testé cela, mais vous devriez pouvoir appliquer ces idées à votre cas. Cela fonctionne pour le mien.

Mise à jour: Je viens de relire votre question et j'ai noté que vous vouliez pouvoir trier dans la colonne d'association. Je viens de vérifier ma mise en œuvre et cela ne fonctionne vraiment pas. Ma réponse peut vous être inutile mais je la laisserai de toute façon (pourrait aider quelqu'un d'autre).

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 

produits.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 
Questions connexes