未定义的方法`location&#39; for#<event :: activerecord_associations_collectionproxy:0x007f834658ea50>

时间:2015-06-03 01:23:28

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有两个模型:事件和位置。位置has_many事件和一个事件belongs_to一个位置。位置具有名为&#34; city&#34;的属性。在控制器中,我有以下代码:

@locations = Location.all.includes(:events)
@events = @locations.collect{|l| l.events}
@events.each do |event|
    puts "event is #{event.inspect}"
    puts "event location is #{event.location}"
end

我收到以下错误:

undefined method `location' for #<Event::ActiveRecord_Associations_CollectionProxy:0x007f834658ea50>

我知道所有活动都有位置,所以这应该有效。我如何让它工作?

3 个答案:

答案 0 :(得分:1)

您的@locations.collect调用正在返回ActiveRecord_Associations_CollectionProxy数组,这就是错误原因。如果您需要,可以从集合中选择第一个元素,如下所示:

@events = @locations.collect{|l| l.events}
@events.each do |event|
    puts "event is #{event.first.inspect}"
    puts "event location is #{event.first.location}"
end

或者你可以flatten collect的结果:

@events = @locations.collect{|l| l.events}.flatten
@events.each do |event|
    puts "event is #{event.inspect}"
    puts "event location is #{event.location}"
end

答案 1 :(得分:1)

如果您的任何地点没有与之相关的事件,这将失败。 您可以尝试确保阵列中没有nil元素:

@locations = Location.all.includes(:events)
@events = @locations.collect{|l| l.events}.
  flatten.
  reject{|e| e.nil?}
@events.each do |event|
    puts "event is #{event.inspect}"
    puts "event location is #{event.location}"
end

答案 2 :(得分:0)

@events = Event.includes(:location).select('events.*, locations.city')

现在,您可以访问地点的城市

<% @events.each do |e|%>
  <%= e.city %>
<% end %>