2012-01-13 12 views
20

He los siguientes modelosmétodo no definido de ActiveRecord :: Relation

class Book < ActiveRecord::Base 
    has_many :chapters 
end 

y

class Chapter < ActiveRecord::Base 
    belongs_to :book 
end 

en /chapters/edit/id Puedo obtener

undefined method `book' for #<ActiveRecord::Relation:0x0000010378d5d0> 

cuando intento acceder libro como éste

@chapter.book 
+0

¿Puede verificar y confirmar que 'Chapter' tiene una columna de base de datos' book_id' y que su base de datos se migra correctamente mediante 'rake db: migrate'? –

+0

por favor, muestre su método de control de edición, donde @capter está inicializado – alony

Respuesta

52

Parece que @chapter no es un solo objeto de capítulo. Si se inicializa @chapter algo como esto:

@chapter = Chapter.where(:id => params[:id]) 

continuación, se obtiene una relación de objeto (que puede ser tratada como una colección, pero ni un solo objeto). Así que para solucionar este problema que necesita para recuperar un registro utilizando find_by_id, o tomar un primero de la colección

@chapter = Chapter.where(:id => params[:id]).first 

o

@chapter = Chapter.find_by_id(params[:id]) 
+0

que es extraño, por lo que 'where' devolverá una colección incluso si solo se devuelve un registro. añadiendo 'first' lo solucionó. –

+1

@JosephLeBrech si encuentra un único ActiveRecord de una identificación, generalmente puede usar '@chapter = Chapter.find (params [: id])' –

+0

Estoy a punto de cambiarlo para que haga algo así como 'Books. find (params [: book_id]). chapters.where (: chapter_no => params [: chapter_no]). first' porque quiero que el usuario pueda reordenar los capítulos y se debe acceder de esa forma. así que eso es lo estoy cambiando para no usar find –

3

Probar: Chapter.find(params[:id]).first

3

Como los otros han dicho - la adición el método .first resolverá esto. He experimentado este problema al llamar a @chapter por su ID única. Agregar .first (o .take en Rails 4) asegurará que solo se devuelva un objeto.

Cuestiones relacionadas