我在视图中有以下循环来显示给定锦标赛中的所有分区。当我尝试复制控制器中的逻辑时,然后将变量传递给视图,我和“未定义的方法”错误。对我所做错的任何帮助都将不胜感激。
模型
class Tournament < ApplicationRecord
has_and_belongs_to_many :divisions
end
class Division < ApplicationRecord
has_and_belongs_to_many :tournaments
end
WORKING Controller&amp;视图 控制器
def index
@tournaments = Tournament.all
end
查看
<% tournament.divisions.ids.each do |tdi| %>
<%= Division.find(tdi).name %>
<% end %>
不工作控制器&amp;视图 控制器
def index
@tournaments = Tournament.all
@tournaments.divisions.ids.each do |tdi|
@divisions = Division.find(tdi).name
end
end
查看
<%= @divisions %>
当我尝试第二个(并且我确定更正确)实现时,我得到索引方法中以下行的“未定义方法`divisions'”错误:
@tournaments.divisions.ids.each do |tdi|
答案 0 :(得分:1)
问题是@tournaments = Tournament.all
此行返回tournament
个对象的列表。因此,在第二行中,您无法将对象列表与任何类型的关联相关联。您必须遍历@tournaments
,然后找到每个锦标赛的divisions
。
def index
@tournaments = Tournament.all
# you can also eager load the tournamnets
# @tournaments = Tournament.includes(:divisions)
@tournaments.each do |tournament|
tournament.divisions.ids.each do |tdi|
@divisions = Division.find(tdi).name
end
end
end
答案 1 :(得分:0)
我认为错误告诉你的是方法id不是一种划分方法。 Yo必须将该方法定义为Division模型中的范围。
scope :ids, -> { pluck(:id) }
另一件事是我不明白你为什么要这样做:
<% tournament.divisions.ids.each do |tdi| %>
<%= Division.find(tdi).name %>
<% end %>
当你可以简单地这样做时:
<% tournament.divisions.each do |tdi| %>
<%= tdi.name %>
<% end %>
答案 2 :(得分:0)
首先,在第二种情况下,你在集合上调用关联,你需要在控制器中执行此操作,最终你需要所有的分区名称,在这里你还有Workbook_SheetChange
查询问题所以要解决这个问题< / p>
n + 1
在视图中
def index
@tournaments = Tournament.includes(:divisions)
end
希望有所帮助!