#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