Использование Rails Gem Active Admin с ассоциациями - PullRequest
8 голосов
/ 17 мая 2011

Я пробую новый гем Rails http://activeadmin.info/, и он отлично работает!Однако я не могу найти документацию о том, как использовать его в разных ассоциациях.Например:

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

Таблица регистрации членства также включает некоторые дополнительные данные (например, посещаемость).Я пытаюсь показать членство как по курсу, так и по имени студента - и разрешить фильтрацию / сортировку по этим именам.Насколько я обнаружил, Active Admin не работает между ассоциациями.Кто-нибудь еще был успешен в этом, или нашел другой драгоценный камень, который делает?Большое спасибо!

Ответы [ 4 ]

5 голосов
/ 21 мая 2011

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

не забывайте миграции для присоединяющейся таблицы (: 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

Теперь определите форму в вашем ресурсе ActiveAdmin, переопределите значение по умолчанию

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
4 голосов
/ 14 июня 2011

Я уже некоторое время играю с ActiveAdmin, вот как мне удалось заставить ассоциации работать в индексах и формах.

Я только что догадался о некоторых столбцах вашей модели ниже. Также обратите внимание, в форме. Раздел «персона» покажет все столбцы для редактирования, тогда как раздел «курс» покажет только указанный столбец.

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

Я не проверял это, но вы должны быть в состоянии применить эти идеи к вашему делу. Это работает для меня.

Обновление: Я только что прочитал ваш вопрос еще раз и отметил, что вы хотите иметь возможность сортировать по столбцу ассоциации. Я только что проверил свою реализацию, и это действительно не работает. Мой ответ может быть бесполезен для вас, но я все равно оставлю его здесь (может помочь кому-то еще).

1 голос
/ 29 мая 2011

Я только начал использовать этот драгоценный камень сам, и хотя я не удосужился показать информацию об ассоциации, вот как вы создаете форму для ассоциаций:

form do |f|
  f.inputs

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

  f.buttons
end

Это даст вам основную форму с лесами.

0 голосов
/ 17 марта 2013

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

products.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
...