1

열 머리글로 연결과 함께 has_many_through 연결 목록을 표시하고 테이블 행의 항목으로 through : 값을 표시하려면 어떻게해야합니까?Active Admin 인덱스에서 has_many 연관을 열로 표시

나는 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 

, 각 작업에 대한 행, 열 머리글 각 요소의 제목, 그리고 각각의 점수 셀의 값으로 작업하십시오.

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

과 같은 출력을 얻을 :

나는 app/admin/jobs.rb 파일 같은 것을 할 필요가 기대

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> 
+0

나는 Muhamamd Awais가 옳다고 생각합니다. 나는 당신이 당신의 접근 방식을 바꿀 필요가 있다고 생각합니다. 먼저 작업을 반복하여 job.scores를 갖도록하십시오. 왜냐하면 각 개별 객체를 반복하지 않는 한 점수를 찾지 못하기 때문입니다. 둘째, erb 파일로 생각하십시오. 금주 모임의 모든 내용이 인쇄됩니다. 그래서 job.scores.each라고하면 실제로 <% = job.score.each do | score | %> 대신 <% job.score.each do | score | %>. 그것이 의미가 있는지 알고 싶다면 – eileencodes

+0

감사합니다. Eileen, 두 번째 요점은 새로운 것입니다. 나는 그렇게 생각하지 않았습니다. 첫 번째 개념은 의미가 있지만,'index' 블록의 컨텍스트 내에서'job.scores '를 얻기 위해 작업을 반복하는 법을 이해할 수 없었습니다. 이와 관련하여 도움이 될 것입니다. – Tonys

답변

0

다음과 같이,

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

제안 해 주셔서 감사합니다. 그러나 문제가 해결되지 않습니다. - 받고있는 오류로 내 질문을 업데이트했습니다. 그것은'jobs'이 실제로 activeadmin'IndexTableFor' 인스턴스에 대한 참조이기 때문인 것 같습니다. 기본 객체를 반복하는 방법을 찾아야한다고 생각합니다. – Tonys

+0

당신이 디버거를 넣고 값을 확인하면 아마 모든 작업이 포함 된 작업 배열이 주어질 것입니다. 그래서 우리는 각 작업을 반복해야한다고 생각합니다. 각 직업에 대해 우리는 그 점수를 찾고있을 것입니다. –

+0

Muhamamd, 다시 시도해 주셔서 감사합니다. 나는 이것이 잘못된 방향으로 가고 있다고 생각한다. 왜냐하면'index' 블록 안의'jobs.each do'는 한 줄 안의 전체 작업 세트를 중첩시킬 것이고 각 줄마다 매번 반복 될 것이기 때문입니다.어느 쪽이든, 첫 번째 반복자에서'jobs'에 대한 참조는 activeadmin – Tonys

3

나는 정확하게 작동한다고 생각합니다. 각 행을 모두 한 행으로 처리 할 수 ​​있습니다. 행렬이 작동하지 않으면 맵을 찾거나 수집합니다. 각각의지도와지도를 연결할 수도 있습니다. 을 사용하면 compact를 사용하므로 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 
+0

Eileen에게 다시 한번 감사 드리며, 이것은 요인 이름 ('Education'과'Experience')이 내가 루프를 파악하려고 시도하는 것만 큼 효과가있는 것처럼 보입니다. 본질적으로 나는 연관되어있는 이름들을 끌어 올 필요가있다 - 그들은 앞에서 알 수 없을 것이다. – Tonys

0

잡스 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 

이는이 예제를 참조 당신의 문제에 대한 정확한 해결책은 아니지만 그것을 어떻게 할 수 있는지에 대한 개요입니다!