Ruby on rails 如何循环连接表
我拥有的模型: 类别: 提供者: 分类: 游戏: 我需要展示属于特定提供商的游戏。我试着这样做:Ruby on rails 如何循环连接表,ruby-on-rails,join,activerecord,Ruby On Rails,Join,Activerecord,我拥有的模型: 类别: 提供者: 分类: 游戏: 我需要展示属于特定提供商的游戏。我试着这样做: <% @provider.categorizations.joins(:games).each do |game| %> <%= game.title %> <% end %> 它给了我一个错误:NoMethodError:for的未定义方法“title”。因此,它循环进行分类。在连接的游戏表中循环的最佳方式是什么?谢谢。首先,您应该在控制器中执行请求,或者最
<% @provider.categorizations.joins(:games).each do |game| %>
<%= game.title %>
<% end %>
它给了我一个错误:NoMethodError:for的未定义方法“title”。因此,它循环进行分类。在连接的游戏表中循环的最佳方式是什么?谢谢。首先,您应该在控制器中执行请求,或者最好从控制器调用模型中定义的范围 不要忘记,活动记录只是一个ORM,一个允许您操作SQL的工具 使用@provider.categorizations.joins:您不需要游戏。您正在请求分类,并与games表进行联接。这种连接通常允许按游戏属性进行过滤 要做您想做的事情,您应该执行以下操作: @games=Game.joins:categorization.where'categorization.provider_id=?',@provider.id 如您所见,联接不返回分类,它允许我使用分类作为过滤器
您应该始终注意活动记录生成的SQL。查看服务器跟踪中生成的SQL查询。我猜“title”是游戏的属性,而不是分类,因此您需要返回游戏数组,或者在末尾添加一个select以将title属性拉入分类对象,如下所示:
<% @provider.categorizations.joins(:games).select('dba.games.title').each do |game| %>
<%= game.title %>
<% end %>
只需添加一点-您不应该在视图文件中执行此操作。我甚至不会在控制器里这样做。我倾向于将这种逻辑封装到服务类中,服务类在控制器中实例化以返回一组结果。控制器应该只传递打开的结果集,然后由视图显示
class Provider < ActiveRecrord::Base
# this could be a scope instead, or in a seperate class which
# the provider model delegates to- whatever floats you boat
def get_games
# you could use pluck instead, which would return an array of titles
categorizations.joins(:games).select('dba.games.title')
end
end
class ProviderController < ApplicationController
def show
provider = Provide.find(params[:id])
@games = provider.get_games
end
end
<% @games.each do |game| %>
<%= game.title %>
<% end %>
按照您所说的做:在控制器中,我定义了@games变量,然后它给了我一个错误:ActionView::Template::error PG::UndefinedTable:错误:表分类行1的子句条目中缺少:…ages.id=games.categorization\u id其中categoriza…^:选择games.*从games内部加入categorizations ON categorizations.id=games.categorization\u id其中categorization.provider\u id=2:抱歉,刚刚输入了一个错误:categorization.provider\u id应该是categorizations.provider\u id
class Game < ApplicationRecord
belongs_to :categorization
end
<% @provider.categorizations.joins(:games).each do |game| %>
<%= game.title %>
<% end %>
<% @provider.categorizations.joins(:games).select('dba.games.title').each do |game| %>
<%= game.title %>
<% end %>
class Provider < ActiveRecrord::Base
# this could be a scope instead, or in a seperate class which
# the provider model delegates to- whatever floats you boat
def get_games
# you could use pluck instead, which would return an array of titles
categorizations.joins(:games).select('dba.games.title')
end
end
class ProviderController < ApplicationController
def show
provider = Provide.find(params[:id])
@games = provider.get_games
end
end
<% @games.each do |game| %>
<%= game.title %>
<% end %>