2013-04-12 2 views
0

Просто начинайте работу с рельсами и пытайтесь реорганизовать немного моего представления, и я немного озадачен тем, где искать ответ, поскольку я внутри каждого цикла Мне нужен доступ к | item |.Ассоциация рефакторов вне поля зрения из цикла

Я вытаскиваю писателя из файла CSV, используя таблицу создателя и ассоциацию HABTM с книгами. Причина в том, что иногда писатель также является иллюстратором, а также редактором, мне не нужны 3 (и более) таблицы для каждой конкретной роли автора книги.

Книги модели (с CSV импорт)

writer = Creator.where(name: row['writer']).first_or_create!(row.to_hash.slice(:writer)) 
    book.creators << writer 
    book.writer_id = writer.id 

книга Посмотреть

books.each do |book| 
    link_to book.creators.detect{|w| w.id == book.writer_id}.name, creator_path(id: book.writer_id) 

А потом я дублировать для художника, редактора, и т.д ...

Я первый попробовал @ книги в контроллере, но мне нужно знать, какая книга из цикла. Я не уверен, что следующий шаг, чтобы узнать, поэтому я могу удалить уродливые. Я видел много вещей, которые хочу читать, но не знаю, что им подходит. Помощники? Именованные области?

+0

В чем проблема? Это несколько расплывчато в вопросе. –

+0

Это не проблема, если приложение работает так, как я хочу, но похоже, что я не делаю что-то правильное по сравнению с тем, насколько простым является все остальное. Будучи тем, что я только начинаю, я пытаюсь изучить лучшие практики, и есть много повторений как в модели, так и в представлении, но я не знаю, что изменить, чтобы сделать ее лучше. – tehfailsafe

ответ

0

Часть сложности здесь представлена ​​фактом, используя writer_id и т. Д. Вместо фактической ассоциации, которая, вероятно, упростит ситуацию. Если вы собираетесь придерживаться текущей структуры, хотя, что у вас есть, вероятно, довольно близко к тому, что вы хотите, но вы можете изменить эту link_to линии более простой:

link_to book.creators.find(book.writer_id).name, creator_path(book.writer_id) 

Другим вариантом был бы для настройки метода пользовательских геттера для писателя и иллюстратора в вашей модели, которая позволит вам упростить еще больше:

# book.rb 
def writer 
    creators.find(writer_id) # This should allow you to still eager load it if you want 
end 

def illustrator 
    creators.find(illustrator_id) 
end 

# in your view 
link_to book.writer.name, creator_path(book.writer_id) 

(вы также можете написать сеттер методы, хотя это было бы немного более сложным, и, возможно, не стоит того, если вы не планируете менять создателей.)

+0

Геттер выглядит очень красиво, спасибо! Мне определенно нужно больше смотреть на рубиновые классы вообще, кроме рельсов. В чем заключается фактическая ассоциация? Я использую таблицу books_creators для сопоставления книг и создателей, но мне нужен был способ определить, какая создатель имеет какую роль в каждой книге. Как: через общение с «творчеством» или что-то не совсем мне показалось. – tehfailsafe

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