我正在使用管理 gem。我有一个用户集合,并在该用户仪表板中显示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
。这可能是可能的,但在这里这样做似乎真的很混乱 - 尝试在管理员/users_controller中过滤,但我相信控制器只给我
requested_resource
,而不是该资源上的子对象
有谁知道我如何在管理仪表板中仅显示某些has_many对象?
若要仅显示has_many关系的特定范围,请执行以下操作。
首先,在模型类上,创建一个新的has_many关系,该关系与原始关系平行,具有不同的名称,具有所需的范围。例如,在与 Administrate 源代码捆绑的示例应用中,我向Customer
模型添加了new_england_orders
关联:
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),
新的作用域关联现在应显示在仪表板上。