2010-12-27 8 views
5

Tengo este inexplicable error ActiveRecord :: Relation, undefined method error. No sé por qué, ya que mi modelo de asociación está bien definida y la tabla de eventos tiene las claves foráneas para la tabla de usuarios. He intentado utilizar esta revisión pero fracasó: Rails 3 ActiveRecord::Relation random associations behaviorrails 3.0.3 - ActiveRecord :: Relación, error de método indefinido

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 

mensaje de error

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' 
+0

@matchu, gracias por editar esto y hacerlo más claro. – brg

Respuesta

5

Oneuser tiene muchos events. En su código, parece que está intentando acceder al events en @users, que presumiblemente sería más de un usuario.

es probable que desee hacer algo como:

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

o:

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

Además, no es necesario especificar attr_accessible en cualquier atributo que son columnas en su base de datos.

+0

muchas gracias, fui con la primera opción y eso lo arregló para mí. – brg

8

Si lee el mensaje de error de cerca, no dice que el problema es la relación con los eventos. Dice:

indefinidos método `eventos para

10: <% @ users.events.each hacer | evento | %>

También tuve problemas para entender esto cuando primero encontré con que

Esto significa que el buscador de @users devuelve un objeto Relation lugar de la lista de usuarios (o el objeto no así llamado) que esperabas

Si está utilizando un buscar en cualquier lugar, debe cambiarlo por un "where (: id => ...).primero"

Por ejemplo, es probable que tienen algo que se parece a esto en su controlador:

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

Esto debe ser cambiado a:

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

O usted podría utilizar el objeto relación resultante después el "dónde" para condiciones adicionales y sql "configuración"

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

A r El objeto elation ejecutará la consulta solo cuando se invoque un ".first" ".all" ".each" o ".inspect".

Cuestiones relacionadas