rails_admin 获取当前实体并显示自定义枚举

rails_admin get the current entity and display custom enum

我正在尝试使用除名称以外的其他内容来自定义枚举字段。

例如,我在数据库中的实体记录有如下列:name、postal_code、id 等 ..

我想在下拉菜单中有这样的内容“#{name} #{postal_code}, #{department}

我正在这样做:

field :city, :enum do
  enum do
    # Here I would like to get the entity from DB in order to have all 
    # columns to something similar as => 
      entity.collect.each { |c| "#{c.name} (#{c.postal_code}), # 
      {c.department.name}"}
  end
end

但我不知道如何获取 City 实体实际值的活动记录(在我的示例中为实体)。

我该怎么做?

注意:该部门属于与 City

关联的另一个模型

你可以做到,但你需要为每个 select 下拉列表定义一个名称和一个(稳定的)值,一个简单的散列来做到这一点:

  field :city, :enum do
    enum do
      entity = bindings[:object]
      City.all.map do |c| 
        {c.id => "#{c.name} (#{c.postal_code}), #{c.department.name}"}
      end
    end
  end

我假设每个城市都有一个 ID,但您可以使用要存储在数据库该字段上的任何值。

因此您的用户会看到漂亮的格式化字符串,但 rails 管理员会 post 城市字段中带有城市 ID 的表单。

考虑到 OP 评论,我假设所讨论的模型具有如下定义的关联:

belongs_to :city

city 字段本身是这样的

rails_admin do
  edit do
    field :city
  end
end

因为这样 rails 管理员将呈现一个 select 下拉列表,允许您搜索城市而无需全部加载。

之后在 City 模型上你可以定义标题方法,引用 the docs

默认情况下,它会尝试对相关记录调用 "name" 或 "title" 方法。如果 object 对两者都不响应,那么标签将由模型的类名加上其数据库标识符构成。您可以添加标签方法(或替换默认的 [:name, :title])为:

RailsAdmin.config {|c| c.label_methods << :rails_admin_title }

然后可以定义标题方法

class City < ApplicationRecord
   def rails_admin_title
      "#{self.name} (#{self.postal_code}), #{self.department.name}"
   end 
end

在相关问题中,您可能想要配置 rails 管理员搜索城市的方式,我会 just link to the docs