通过关联显示has_many作为Active Admin索引中的列

时间:2013-03-18 11:15:20

标签: ruby-on-rails ruby ruby-on-rails-3 activeadmin has-many-through

如何将关联的has_many_through关联列表显示为列标题,将through:value显示为表格行中的条目?

我有3个型号:

class Jobs 
  attr_accesor :title 

  has_many :scores 
  has_many :factors, through: :scores 
end 

class Scores 
  attr_accesor :score 

  belongs_to :job 
  belongs_to :factor 
end 

class Factor 
  attr_accesor :name 
  has_many :scores 
  has_many :jobs, through: :scores 
end 

我希望能够在Jobs索引中显示每个Job的一行,每个Factor的标题作为列标题,以及每个Job的分数作为单元格中的值。

我希望在app/admin/jobs.rb文件中执行类似的操作:

index do |jobs|
  column :title
  jobs.scores.each do |score|
    column(score.factor.name) { |score| score.score }
  end
end

得到这样的输出:

Job              |  Education  |  Experience  |  Leadership  |  ...  |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CEO              |     600     |     720      |     580      |  ...  |
Admin Assistant  |     210     |     200      |     150      |  ...  |

但是activeadmin似乎不喜欢jobs.scores.each行,给出了以下错误:

undefined method `scores' for 
#<ActiveAdmin::Views::IndexAsTable::IndexTableFor:0x00000104d1dad0>

2 个答案:

答案 0 :(得分:4)

如果我正确理解您的数据,我认为这将有效。您可以在一行中完成所有操作,如果不起作用,请查看map或collect。你也可以链接每个和地图。确保 你正在使用紧凑型,所以你不会遇到nils。下面我假设score.factor.name等于每列应该命名的内容以及填写的数据。

index do |jobs|
  column :title
  column "Education" do |job|
   job.scores.map { |score| score if score.factor.name == "Education"  }.compact
  end
  column "Experience" do |job|
   job.scores.map { |score| score if score.factor.name == "Experience"  }.compact
  end
end

答案 1 :(得分:-1)

查看Jobs has_many分数

的示例
ActiveAdmin.register Jobs do 
 index do
 :scores do |i|
   table_for i.scores do
     column do |user|
       user.scores
     end
   end
 end
 end
end

这不是您问题的确切解决方案,但它概述了您如何做到这一点..!