获取ActiveRecord :: Relation的未定义方法

Jos*_*ech 23 activerecord ruby-on-rails

我有以下型号

class Book < ActiveRecord::Base
  has_many :chapters
end
Run Code Online (Sandbox Code Playgroud)

class Chapter < ActiveRecord::Base
    belongs_to :book
end
Run Code Online (Sandbox Code Playgroud)

/chapters/edit/id我得到

undefined method `book' for #<ActiveRecord::Relation:0x0000010378d5d0>
Run Code Online (Sandbox Code Playgroud)

当我试图访问这样的书

@chapter.book
Run Code Online (Sandbox Code Playgroud)

alo*_*ony 57

看起来@chapter不是一个章对象.如果@chapter初始化如下:

@chapter = Chapter.where(:id => params[:id])
Run Code Online (Sandbox Code Playgroud)

然后你得到一个Relation对象(可以将其视为集合,但不是单个对象).因此,要解决此问题,您需要使用find_by_id或从集合中获取第一个记录来检索记录

@chapter = Chapter.where(:id => params[:id]).first
Run Code Online (Sandbox Code Playgroud)

要么

@chapter = Chapter.find_by_id(params[:id])
Run Code Online (Sandbox Code Playgroud)

  • 在Rails 4中,不推荐使用动态查找程序.所以,我用`.where()`交换了所有动态查找器,但后来遇到了这个问题.因此,如果你换掉`.where()`的动态查找器,一定要包括`.first`. (4认同)

Jas*_*son 5

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