Rails Administrate - Настроить has_many

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

Сейчас моя user_dashboard выглядит как

class UserDashboard < Administrate::BaseDashboard
  # ATTRIBUTE_TYPES
  # a hash that describes the type of each of the model's fields.
  #
  # Each different type represents an Administrate::Field object,
  # which determines how the attribute is displayed
  # on pages throughout the dashboard.
  ATTRIBUTE_TYPES = {
    ...
    sub_items: Field::HasMany.with_options(limit: 10)
  }

Прямо сейчас, это работает по умолчанию, но проблема это показывает все изsub_itemsдля пользователя, что нормально, но я пытаюсь показать толькоhas_manyотношение, если оно имеет определенный тип. Например, по умолчанию я не хочу, чтобы показать все изuser.sub_items, Я только хочу показать user.sub_items.where(category: [arr_of_options], sub_category: [arr_of_options])

Прямо сейчас я попробовал

  • для передачи параметров, показанных здесь https://github.com/thoughtbot/administrate/blob/master/docs/customizing_dashboards.md, но дляField::HasMany
  • показывать только определенную коллекцию has_many в представлении, в этом случае это будет admin/users/show.html.erb. Это, вероятно, возможно, но это кажется действительно беспорядочным, чтобы сделать это здесь
  • пробовал фильтровать в admin / users_controller, но я считаю, что контроллер дает мне только requested_resource а не подобъекты на этом ресурсе

Кто-нибудь знает, как я могу показывать только определенные объекты has_many на панели управления администратора?

1 ответ

Решение

Чтобы показать только определенную область отношения has_many, выполните следующие действия.

Сначала в классе модели создайте новую связь has_many, параллельную исходной, с другим именем, имеющую желаемую область видимости. Например, в примере приложения, связанного с исходным кодом администрирования, я добавилnew_england_orders ассоциация с Customer модель:

 class Customer < ApplicationRecord
   has_many :orders, dependent: :destroy
+  has_many :new_england_orders, ->{ where(address_state: %w{VT NH MA CT ME RI}) }, class_name: "Order"
   belongs_to :country, foreign_key: :country_code, primary_key: :code
   has_many :log_entries, as: :logeable

Во-вторых, добавьте это отношение на свою панель инструментов (возможно, заменив исходное) и обязательно добавьте class_name вариант, чтобы администратор знал, какую панель управления для него использовать:

     lifetime_value: Field::Number.with_options(prefix: "$", decimals: 2),
     name: Field::String,
     orders: Field::HasMany.with_options(limit: 2, sort_by: :id),
+    new_england_orders: Field::HasMany.with_options(limit: 2, sort_by: :id, class_name: 'Order'),
     log_entries: Field::HasManyVariant.with_options(limit: 2, sort_by: :id),
     updated_at: Field::DateTime,
     kind: Field::Select.with_options(collection: Customer::KINDS),

Ваша новая связь с заданной областью теперь должна появиться на панели инструментов.

Другие вопросы по тегам