1

Как отобразить список ассоциаций has_many_through с ассоциацией в качестве заголовков столбцов и значение сквозного: как запись в строке таблицы?Отображение has_many через ассоциацию как столбец в Active Admin index

У меня есть 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 

Я хочу, чтобы иметь возможность показать, в индексе Работа, строка для каждого задания, название каждого фактора в качестве заголовка столбца, и оценки каждого Иов как значение в ячейке.

Я хотел бы ожидать, чтобы сделать что-то подобное в 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> 
+0

Я думаю, что Мухаммед Awais прав, я думаю, вам нужно изменить свой подход. Сначала убедитесь, что вы выполняете задания, так что у вас есть job.scores, потому что теперь он не узнает, чтобы найти счет, если вы не выполняете итерации по каждому отдельному объекту. Во-вторых, подумайте об этом как файле erb. Все в AA напечатано - поэтому, когда вы говорите job.scores.each, он фактически распечатывает его, как <% = job.score.each do | score | %> вместо <% job.score.each do | score | %>. Дайте мне знать, если это имеет смысл. – eileencodes

+0

Спасибо Эйлин, второй момент новый, я так не думал об этом. Первое имеет смысл, но мне не удалось выяснить, как перебирать задания, чтобы добраться до 'job.scores' в контексте блока' index'. ЛЮБОЙ помощи в этом отношении было бы здорово. – 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, спасибо за попытку снова. Я думаю, что это происходит не в том направлении, потому что 'jobs.each do' внутри блока index будет вложен весь набор заданий внутри одной строки и каждый раз повторяется для каждой строки.В любом случае ссылка на 'jobs' в первом итераторе, по-видимому, является проблемой для activeadmin – Tonys

3

Если я правильно понимаю ваши данные, я думаю, что это сработает. Вы можете делать все на одной линии, также если это не работает, смотрите карту или собирайте ее. Вы также можете связать каждую карту и карту. Убедитесь, что вы используете компакт-диск, чтобы не ударить ниль. Ниже я предполагаю 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 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 

это а не точное решение вашей проблемы, но это обзор того, как вы можете это сделать ..!

Смежные вопросы