рельсы 3.0.3 - ActiveRecord :: Relation, неопределенная ошибка метода - PullRequest
5 голосов
/ 28 декабря 2010

У меня возникла необъяснимая ActiveRecord :: Relation, неопределенная ошибка метода.Я не знаю почему, так как моя ассоциация модели четко определена, а таблица событий имеет внешние ключи для пользовательской таблицы.Я попытался использовать это исправление, но оно не удалось: Rails 3 ActiveRecord :: Поведение случайных ассоциаций отношений

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'

Ответы [ 2 ]

8 голосов
/ 03 января 2011

Если вы внимательно прочитаете сообщение об ошибке, это не говорит о том, что проблема в связи с событиями.Он говорит:

неопределенный метод `events 'для

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

У меня также были проблемы с пониманием, когда я впервые столкнулся с ним

Это означает, что искатель @users возвращает объект Relation вместо списка пользователей (илине очень хорошо названный объект) вы ожидали.

Если вы где-нибудь используете находку, вы должны изменить ее на "где (: id => ...). first"

Например, у вас, вероятно, есть что-то похожее на ваш контроллер:

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

Это должно быть изменено на:

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

Или вы можете использовать результирующий объект отношения после «где»для дополнительных условий и sql «конфигурации»

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

Объект отношения будет выполнять запрос только при вызове «.first», «.all», «.each» или «.inspect».

5 голосов
/ 28 декабря 2010

Один user имеет много events.В вашем коде похоже, что вы пытаетесь получить доступ к events на @users, который, вероятно, будет более чем одним пользователем.

Возможно, вы захотите сделать что-то вроде

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

или:

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

Кроме того, вам не нужно указывать attr_accessible для любых атрибутов, которые являются столбцами в вашей базе данных.

...