我有两个模型:事件和位置。位置has_many事件和一个事件belongs_to一个位置。位置具有名为" city"的属性。在控制器中,我有以下代码:
@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>
我知道所有活动都有位置,所以这应该有效。我如何让它工作?
答案 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 %>