【问题标题】:rails 3.0.3 - ActiveRecord::Relation, undefined method errorrails 3.0.3 - ActiveRecord::Relation,未定义的方法错误
【发布时间】:2010-12-27 22:40:24
【问题描述】:

我遇到了这个无法解释的 ActiveRecord::Relation, undefined method error 。我不知道为什么,因为我的模型关联定义明确并且事件表具有用户表的外键。我尝试使用此修复程序但失败了:Rails 3 ActiveRecord::Relation random associations behavior

event.rb

class Event < ActiveRecord::Base
  belongs_to :user

  attr_accessible :event_name, :Starts_at, :finish, :tracks
end

user.rb

class User < ActiveRecord::Base
  has_many :events, :dependent => :destroy

  attr_accessible :name, :event_attributes

  accepts_nested_attributes_for :events,  :allow_destroy => true

end

schema.rb

ActiveRecord::Schema.define(:version => 20101201180355) do

  create_table "events", :force => true do |t|

    t.string   "event_name"
    t.string   "tracks"
    t.datetime "starts_at"
    t.datetime "finish"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
  end
end

错误信息

NoMethodError in Users#index 
undefined method `events' for #<ActiveRecord::Relation:0x4177518>

Extracted source (around line #10):

7:  <th><%= sortable "Tracks" %></th>

8:   </tr>


10:  <% @users.events.each do |event| %> 

11: <% debugger %> 

12:   <tr>

13:     <td><%= event.starts_at %></td>

Trace of template inclusion: app/views/users/index.html.erb

Rails.root: C:/rails_project1/events_manager
Application Trace | Framework Trace | Full Trace

app/views/users/_event_user.html.erb:10:in `_app_views_users__event_user_html_erb__412443848_34308540_1390678'
app/views/users/index.html.erb:7:in `_app_views_users_index_html_erb___603337143_34316016_0'

【问题讨论】:

  • @matchu,感谢您编辑并使其更清晰。

标签: ruby-on-rails active-relation


【解决方案1】:

如果您仔细阅读错误消息,它不会说问题出在与事件的关系上。 它说:

未定义的方法“事件”

10:

当我第一次碰到它时,我也很难理解它

这意味着@users 的查找器正在返回一个关系对象,而不是您期望的用户列表(或名称不好的对象)。

如果您在任何地方使用 find,则应将其更改为“where(:id => ...).first”

例如,您的控制器中可能有如下所示的内容:

@users = User.find(<conditions go here>)

这应该改为:

@users = User.where(<conditions go here>).all

或者您可以在“where”之后使用生成的关系对象作为额外条件和 sql“配置”

@users = User.where(:admin => true).where('created_at > ?', min_date).order('created_at').limit(10).all

关系对象只有在调用“.first”“.all”“.each”或“.inspect”时才会执行查询。

【讨论】:

    【解决方案2】:

    一个 user 有很多 events。在您的代码中,您似乎正在尝试访问 @users 上的 events,这可能是多个用户。

    你可能想做这样的事情:

    @users.each do |user|
      user.events.each do |event|
        ...
      end
    end
    

    或:

     @user.map(&:events).flatten.each do |event|
       ...
     end
    

    此外,您无需在数据库中作为列的任何属性上指定attr_accessible

    【讨论】:

    • 非常感谢,我选择了第一个选项并为我解决了问题。
    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 2015-08-09
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多