Rails_admin,根据关联更改枚举字段的值

Rails_admin, change values of enum field depending of association

我有四个模型:ShopItemCategorySubCategory

ShopsCategorySubCategoryhas_and_belongs_to_many 关联。

ShopsItemshas_many 关联。

CategorySubCategorieshas_many 关联。

CategorySubCategory has_many Items.

当我创建Shop时,我可以选择很多类别和子类别。

当我尝试创建 Item 时,rails_admin 为类别和子类别创建了 select 框。但是,有问题。 它让我从所有类别和子类别中进行选择

我希望能够 select 仅属于我的 selected 商店的类别和子类别。

是否可以在 rails_admin 中根据其他模型关联更改 select 枚举值?

Category

代码
class Category
    include Mongoid::Document
    has_many :sub_categories, inverse_of: :category
    has_many :items

    accepts_nested_attributes_for :sub_categories
end

SubCategory

代码
class SubCategory
    include Mongoid::Document
    has_many :items
    belongs_to :category, inverse_of: :sub_categories
end

Shop

代码
class Shop
    include Mongoid::Document
    has_many :items, dependent: :destroy, inverse_of: :shop
    has_and_belongs_to_many :categories, inverse_of: nil
    has_and_belongs_to_many :sub_categories, inverse_of: nil
    accepts_nested_attributes_for :items
end

Item

代码
class Item
    include Mongoid::Document
    belongs_to :shop, inverse_of: :items
    belongs_to :category
    belongs_to :sub_category
end

============================可能的解决方案========== =============

因为 ShopCategory 之间存在单向 has_and_belongs_to_many 关联,这意味着 Shop 存储了 Categories.[=47 的 id 数组=]

我的模型也是Mongoid Documents,这意味着我不能使用连接。

在我的 Item edit 操作中,我添加了以下代码:

field :category do
    associated_collection_cache_all false
    associated_collection_scope do
       item = bindings[:object]
      shop = item.shop
      Proc.new { |scope|
        scope = scope.where(id: {"$in" => shop.category_ids.map(&:to_s)}) if item.present?
      }
    end
end

现在它允许我按商店类别选择类别。但是,有一个问题,我不能在 create action

上使用它

rails_admin 支持范围关联。参见:

https://github.com/sferik/rails_admin/wiki/Associations-scoping

例如:

config.model Item do
  field :category do
    associated_collection_cache_all false  
    associated_collection_scope do
      item = bindings[:object]
      Proc.new { |scope|
        scope = scope.joins(:shops).where(shops: {id: item.shop_id}) if item.present?
      }
    end
  end
end

注意 "bindings[:object] can be null for new parent records!" 的警告。您可能必须在范围生效之前保存项目。过去我在 active_admin 表单中添加了条件,因此范围字段仅在记录保存后显示。