1

has_many_through アソシエーションのリストを、そのアソシエーションを列見出しとして表示し、through: 値をテーブル行のエントリとして表示するにはどうすればよいですか?

私は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>
4

2 に答える 2

5

あなたのデータを正しく理解していれば、これでうまくいくと思います。また、それがうまくいかない場合は、マップまたは収集を調べてください。それぞれをチェーンしてマップすることもできます。nil に当たらないように、コンパクトを使用していることを確認してください。以下では、score.factor.nameが各列の名前と入力されるデータと等しいと仮定しています。

index do |仕事|
  コラム:タイトル
  コラム「教育」は|仕事|
   job.scores.map { |スコア| スコア if score.factor.name == "教育" }.compact
  終わり
  コラム「経験」
   job.scores.map { |スコア| score if score.factor.name == "経験" }.compact
  終わり
終わり
于 2013-03-18T22:58:33.900 に答える
-1

Jobs has_many Scores については、この例を参照してください。

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

これはあなたの問題の正確な解決策ではありませんが、それを行う方法の概要です..!

于 2013-06-19T07:33:06.120 に答える