Использование Rails Gem Active Admin с ассоциациями

#ruby-on-rails-3 #ruby-on-rails-4 #rubygems #activeadmin

#ruby-on-rails-3 #ruby-on-rails-4 #rubygems #activeadmin

Вопрос:

Я тестирую новый Rails gemhttp://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 не работает между ассоциациями. Кто-нибудь еще добился успеха в этом или нашел другой gem, который это делает? Большое спасибо!

Ответ №1:

ингредиент.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
  

Комментарии:

1. Спасибо за ответ — вы получили это из какой-то документации, которую я пропустил? Если да — где это? Проблема в том, что если я сделаю так, как вы показываете, я получу столбец с надписью «Ингредиент». Я не знаю о вас, но это не совсем то, что я ищу. Могу ли я указать столбец ассоциации для отображения?

2. Привет, Тайлер, я получил это из документации simple form gem, похоже, что они используют это. И я также думаю, что я неправильно понял ваш вопрос. У меня не было возможности сделать то, что вы пытаетесь, но я бы сам определил виртуальный атрибут для «Ингредиента» или переопределил атрибут name, в результате чего получилось бы что-то вроде этого: def self.name "Ingredient #{self.name}" end я сам этого не пробовал, поэтому не могу обещать, сработает ли это у вас

3. ActiveAdmin использует Formtastic (github.com/justinfrench/formtastic ), а не SimpleForm. Внутри form do блока практически вся работа выполняется Formtastic. Вероятно, Formtastic также обрабатывает ассоциации, поэтому я бы рекомендовал ознакомиться с их документацией для получения некоторых указаний 🙂

Ответ №2:

Я уже некоторое время играю с 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
  

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

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

Ответ №3:

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

 form do |f|
  f.inputs

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

  f.buttons
end
  

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

Комментарии:

1. я попробовал этот метод. но как только я добавляю блок «f.has_many», появляется ошибка «неопределенный метод `new_record?’ для nil: NilClass». У вас есть какие-либо предложения?

2. Вам нужно добавить accepts_nested_attributes_for в модель, тогда это должно сработать.

Ответ №4:

ингредиент.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