Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何循环连接表_Ruby On Rails_Join_Activerecord - Fatal编程技术网

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 %>