ActiveAdmin在索引页面上显示嵌套属性

时间:2017-08-23 00:38:54

标签: ruby-on-rails activeadmin

如何在列中以逗号分隔的方式显示索引页面上的嵌套资源?

我有3个模特

模型/ job.rb

class Job < ActiveRecord::Base
  validates :title, presence: true
  validates :company, presence: true
  validates :url, presence: true

  has_many :position_type_joins
  has_many :position_types, through: :position_type_joins

  accepts_nested_attributes_for :position_types, :allow_destroy => true    

end

模型/ position_type.rb

class PositionType < ApplicationRecord

  has_many :position_type_joins
  has_many :jobs, through: :position_type_joins

end

模型/ position_type_join.rb

class PositionTypeJoin < ApplicationRecord
  belongs_to :job
  belongs_to :position_type
end

我已成功自定义表单页面,因此它现在将位置类型列为复选框,当前值我已设置为&#34;永久,全职,兼职,合同,实习,志愿者&#34;。

我正在努力解决的问题是,如何自定义ActiveAdmin索引页面,以便显示标题为&#34; Position type&#34;然后每个作业列出已分配的位置类型值。例如:

+-------------------+----------------------+
|     Job title     |    Position Type     |
+-------------------+----------------------+
| Painter           | Contract, Part time  |
| Library Assistant | Part time, Volunteer |
+-------------------+----------------------+

我确实在类似的问题中看到了这种语法,但却无法让它为我工作。

Show child/nested attributes in ActiveAdmin index view column

index do
  column :code
  column 'Sales Agent' do |client|
    client.sales_agent.agent_name if !client.sales_agent.nil?
  end
end

我尝试根据自己的需要编辑

index do
    column 'Position type' do |job|
    job.position_type.name if !job.position_type.name?
  end
end

我得到的错误是

undefined method `position_type'

我对铁轨上的红宝石很新,很抱歉,如果我错过了一些明显的东西。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

尝试类似:

index do
  column 'Position type' do |job|
    job.position_types.map(&:name).join(',')
  end
end

提高SQL的效率:

controller do
  def scoped_collection
    super.includes(:jobs)
  end
end

答案 1 :(得分:1)

问题是您在position_type中呼叫job,但它有很多position_types。所以正确的调用应该是job.position_types,如果有很多,或者如果你只想要第一个调用job.position_types.first,则迭代它们。

注意:请注意,这会生成N + 1个查询,应通过急切加载scoped_collection中的关联来解决。