简单的一对多关系中的ActiveRecord'找不到方法'异常

时间:2011-10-02 21:28:40

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord ruby-on-rails-3.1

这是一项非常基本的任务,但我不能为我的生活找到问题的原因。

我正在做一个附加到用户帐户的基本待办事项列表。我正在使用Sorcery帮助进行用户身份验证和创作,看似很好。

问题在于:

当我尝试以任何方式调用`@ user.list'时,我得到以下异常(这是从rails控制台复制的):

@user = User.where(:email => "me@gmail.com")
   => [#<User id: 1, email: "me@gmail.com", crypted_password:  "$2a$10$tiLFyiuLGSB.UXElEdaTGerSv6/TZoLL4nVFdCNsv1AW...", salt:  "e6275124385b0ea157875bba281c7ae9e3a9858e", created_at: "2011-10-02 05:59:02", updated_at:  "2011-10-02 05:59:02", remember_me_token: nil, remember_me_token_expires_at: nil>] 
@user.lists
NoMethodError: undefined method `lists' for #<ActiveRecord::Relation:0x007f8b6ca89748>
from /Users/<myaccount>/.rvm/gems/ruby-1.9.2-p290@rails3.1/gems/activerecord-      3.1.0/lib/active_record/relation.rb:459:in `method_missing'
from (irb):4
from /Users/<myaccount>/.rvm/gems/ruby-1.9.2-p290@rails3.1/gems/railties-3.1.0/lib/rails/commands/console.rb:45:in `start'
from /Users/<myaccount>/.rvm/gems/ruby-1.9.2-p290@rails3.1/gems/railties-3.1.0/lib/rails/commands/console.rb:8:in `start'
from /Users/<myaccount>/.rvm/gems/ruby-1.9.2-p290@rails3.1/gems/railties-3.1.0/lib/rails/commands.rb:40:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

我的代码/数据库设置

设置很简单 - 我有一个User模型和一个List模型。一个List :belongs_to :user和一个User has_many :lists。我已通过以下迁移将user_id添加到lists表:

class AddUserIdForeignKeyToLists < ActiveRecord::Migration
  def change
    add_column :lists, :user_id, :integer
  end
end

我已经确认我的表(MySQL)中存在字段user_id

我的User模型是:

class User < ActiveRecord::Base

  has_many :lists

  authenticates_with_sorcery!

  attr_accessible :email, :password, :password_confirmation

  validates_confirmation_of :password
  validates_presence_of :password, :on => :create
  validates_presence_of :email
  validates_uniqueness_of :email  
end 

...我的List模型看起来像这样:

class List < ActiveRecord::Base
   belongs_to :user
end

MySQL的表设计视图如下:

users

enter image description here

listsenter image description here

这听起来像是可能存在关系问题,但我似乎无法把它放在一起。有没有人有任何见解?我在Linux机器上运行Rails 3.0.X时从来没有遇到任何麻烦,但这是我第一次涉足OSX上的Rails 3.1,所以我不确定是否可能忽略了潜在的变化?

感谢您提供任何指导

1 个答案:

答案 0 :(得分:5)

User.where(...)

返回User对象的集合,而不是User对象。您需要获取User对象。

@user = User.where(...).first

或更好

@user = User.find_by_email("me@gmail.com")