2012-01-13 79 views
20

我有以下型号获取未定义的方法ActiveRecord的::关系

class Book < ActiveRecord::Base 
    has_many :chapters 
end 

class Chapter < ActiveRecord::Base 
    belongs_to :book 
end 

/chapters/edit/id我得到

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

当我尝试这样访问本书

@chapter.book 
+0

你能仔细检查并确认'Chapter'有一个数据库字段'book_id'和你的数据库是通过'耙分贝正确迁移:migrate'? – 2012-01-13 10:02:34

+0

请出示您的编辑控制方法,其中@chapter初始化 – alony 2012-01-13 10:36:23

回答

52

貌似@chapter不是一个单一的章对象。如果@chapter初始化是这样的:

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

那么你得到一个关系对象(可以被视为一个集合,而不是一个单一的对象)。因此,要解决这个问题,你需要使用find_by_id检索记录,或采取从集合的第一个

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

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

这是奇怪的,所以'where'会返回即使只有一个返回记录集。附加'第一个'固定它。 – 2012-01-13 11:15:13

+1

@JosephLeBrech如果你是从一个id找到一个单一的ActiveRecord,通常可以使用'@chapter = Chapter.find(PARAMS [:编号])' – 2012-01-13 12:43:56

+0

我很担心,这样它确实像'书籍去改变它。 find(params [:book_id])。chapters.where(:chapter_no => params [:chapter_no])。第一个是因为我希望用户能够重新排序章节,并且必须以这种方式访问​​它们。所以这是我改变了它不使用发现 – 2012-01-13 13:48:45

3

尝试:Chapter.find(params[:id]).first

3

正如其他人所说 - 增加.first方法将解决此问题。通过它的唯一ID调用@chapter时,我遇到过这个问题。在Rails 4中添加.first(或.take)将确保只返回一个对象。

相关问题