Rails_admin,根据关联更改枚举字段的值
Rails_admin, change values of enum field depending of association
我有四个模型:Shop
、Item
、Category
、SubCategory
Shops
与 Category
和 SubCategory
有 has_and_belongs_to_many
关联。
Shops
与 Items
有 has_many
关联。
Category
与 SubCategories
有 has_many
关联。
Category
和 SubCategory
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
============================可能的解决方案========== =============
因为 Shop
和 Category
之间存在单向 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 表单中添加了条件,因此范围字段仅在记录保存后显示。
我有四个模型:Shop
、Item
、Category
、SubCategory
Shops
与 Category
和 SubCategory
有 has_and_belongs_to_many
关联。
Shops
与 Items
有 has_many
关联。
Category
与 SubCategories
有 has_many
关联。
Category
和 SubCategory
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
============================可能的解决方案========== =============
因为 Shop
和 Category
之间存在单向 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 表单中添加了条件,因此范围字段仅在记录保存后显示。