代码之家  ›  专栏  ›  技术社区  ›  MSC

Rails 5.1-按关联值排序的显示列表

  •  0
  • MSC  · 技术社区  · 6 年前

    我想列出属于玩家(玩家)的游戏统计信息(Participantstats),并根据玩家的名字(名字)对列表进行排序。很多玩家玩很多游戏。联接表是参与者。每个参与者记录都有一个关联的(单个)参与者统计记录。

    我尝试过各种不同的语法,但控制器中的这一行失败了:

    @pstats = Participantstat.includes(:participant, :player).order('participant.player.first_name')
    

    错误是

    PG::UndefinedColumn:错误:column participantstats.player_id不存在

    以下是模型的相关部分:

    class Player < ApplicationRecord
      has_many :participants, dependent: :destroy
      has_many :participantstats, through: :participants
      has_many :games, through: :participants
    end
    
    class Participant < ApplicationRecord
      belongs_to :player
      belongs_to :game
      has_one :participantstat, dependent: :destroy
      delegate :first_name, to: :player
    end
    
    class Participantstat < ApplicationRecord
      belongs_to :participant
      belongs_to :player
      delegate :player, to: :participant, allow_nil: true
      delegate :first_name, to: :participant
    end
    
    class Game < ApplicationRecord
        has_many :participants, dependent: :destroy
        has_many :players, through: :participants
    end
    

    下面是模式的相关片段:

    ActiveRecord::Schema.define(version: 20180823002200) do
    
      # These are extensions that must be enabled in order to support this database
      enable_extension "plpgsql"
    
      create_table "games", force: :cascade do |t|
        t.text "plays"
      end
    
      create_table "participants", force: :cascade do |t|
        t.bigint "player_id"
        t.bigint "game_id"
        t.string "team"
      end
    
      create_table "participantstats", force: :cascade do |t|
        t.string "result"
        t.integer "fga", default: 0
        t.integer "fgm", default: 0
        t.integer "pts", default: 0
        t.bigint "participant_id"
      end
    
      create_table "players", force: :cascade do |t|
        t.string "first_name"
        t.string "email"
      end
    
      add_foreign_key "participants", "games", on_delete: :cascade
      add_foreign_key "participants", "players", on_delete: :cascade
    end
    

    如您所见,我还尝试使用delegate语句(以及后来删除的代码)来获得结果,但没有成功。

    下面是生成的SQL,FWIW:

    1 回复  |  直到 6 年前
        1
  •  2
  •   Krupa Suthar    6 年前

    您的架构中没有玩家id participantstats 所以你不能直接联系 player 具有 Participantstat belongs_to :player 从…开始 参与者统计 模型。

    Participantstat.includes(participant: :player).order('players.first_name')
    

    有关详细信息,可以使用此链接: nested joins