2016-12-26 2 views
1

У меня есть 2 модели: книга и автор. Они оба являются habtm по отношению друг к другу.ruby ​​вызов метода в течение

Модель Автор выглядит следующим образом:

class Author < ApplicationRecord 
    has_and_belongs_to_many :books 
    def full_name 
     given_name + " " + nom # For ease of select menu in the form 
    end 
end 

В контроллере, этот фрагмент кода создает запись в книгах и в соединительной таблице:

z = Author.find(a[0]) 
z.book << @book 

я положил этот кусок кода в то время как:

i = 0 
lettres = ("a"..."z").to_a 
while i < a.count 
    lettres[i] = Auteur.find(a[i]) 
    lettres[i] << @biblio 
    i += 1 
end 

Причина, по которой я делаю этот путь, заключается в том, что книга c имеют до 20 авторов. a - это массив, содержащий идентификаторы автора.

Это вызывает NoMethodError:

undefined method `<<' for #<Auteur:0x007fd61ab20618> 

Я не понимаю, почему, как при тестировании классов и вызывать к методам в классе, он работает в цикле в то время. Так что это делает работу хорошо:

lettres = ("a"..."z").to_a 
i = 0 
while i < t.count 
    lettres[i] = Blabla.new(t[i]) 
    lettres[i].sound 
    i += 1 
end 
+0

Пожалуйста, добавляйте к вашему вопросу, как выглядит модель 'Auteur' –

+0

Эта ошибка говорит вам, что у вашей модели Auteur нет метода <<. Как я понимаю, Auteur - это автор, а @biblio - это книга? –

+0

да, правильный. Но когда я запускаю этот код из цикла while, он работает нормально. – thiebo

ответ

0

Вы, кажется, не использовать lettres на всех, так что вы можете удалить его.

Кроме того, если a содержит Auteur идентификаторов, просто назвать его auteur_ids:

@auteurs = auteur_ids.map do |auteur_id| 
    auteur = Auteur.find(auteur_id) 
    auteur.books << @biblio 
    auteur 
end 

Если auteur_ids размера меньше, чем 26, вы получите массив с соединением Auteurs и букв.

0

нормально, так, как вы можете видеть, когда вы пытаетесь добавить книгу на автора из цикла, вызывается метод .books так,

i = 0 
lettres = ("a"..."z").to_a 
while i < a.count 
    lettres[i] = Auteur.find(a[i]) 
    lettres[i].books << @biblio 
    i += 1 
end 

- должно сработать. - пункт Список

Также я рекомендую вам изменить ваш код:

a.each_with_index do |id, index| 
    lettres[index] = Auteur.find(id) 
    lettres[index].books << @biblio 
end 
+0

Да, а также вырезать 'while', вы можете использовать' .map' –

+0

И он действительно работает! Глупая ошибка ... Большое спасибо. – thiebo

+0

@SergioTulentsev Я думаю, 'each_with_index' в этом случае выглядит лучше :) –