Rails 5.1 - 显示按关联值排序的列表
Rails 5.1 - Display list ordered by associated value
我想列出属于玩家 (Players) 的游戏统计数据 (Participantstats),并根据玩家的名字 (first_name) 对列表进行排序。许多玩家玩很多游戏。连接 table 是参与者。每个参与者记录都有一个关联的(单个)参与者统计记录。
我尝试了各种不同的语法,但控制器中的这一行失败了:
@pstats = Participantstat.includes(:participant, :player).order('participant.player.first_name')
错误是
PG::UndefinedColumn: ERROR: column participantstats.player_id does not exist
如果我删除 .order 部分,它可以工作,但我自然不会在后续视图模板中以正确的顺序显示记录。
以下是模型的相关部分:
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
正如您在上面看到的,我也尝试使用委托语句(以及我已经删除的代码)来获取结果但没有成功。
这是生成的 SQL,FWIW:
: SELECT "participantstats"."id" AS t0_r0, "participantstats"."result" AS t0_r1, "participantstats"."fga" AS t0_r2, "participantstats"."fgm" AS t0_r3, "participantstats"."pts" AS t0_r4, "participantstats"."reb" AS t0_r5, "participantstats"."ass" AS t0_r6, "participantstats"."stl" AS t0_r7, "participantstats"."blk" AS t0_r8, "participantstats"."seconds" AS t0_r9, "participantstats"."score" AS t0_r10, "participantstats"."participant_id" AS t0_r11, "participants"."id" AS t1_r0, "participants"."player_id" AS t1_r1, "participants"."game_id" AS t1_r2, "participants"."created_at" AS t1_r3, "participants"."updated_at" AS t1_r4, "participants"."team" AS t1_r5, "players"."id" AS t2_r0, "players"."first_name" AS t2_r1, "players"."last_name" AS t2_r2, "players"."email" AS t2_r3, "players"."mobile" AS t2_r4, "players"."notify" AS t2_r5, "players"."created_at" AS t2_r6, "players"."updated_at" AS t2_r7, "players"."shirt" AS t2_r8, "players"."shorts" AS t2_r9, "players"."role" AS t2_r10 FROM "participantstats" LEFT OUTER JOIN "participants" ON "participants"."id" = "participantstats"."participant_id" LEFT OUTER JOIN "players" ON "players"."id" = "participantstats"."player_id" ORDER BY participants.players.first_name
您的架构在 participantstats
table 中没有 player_id 这就是为什么您不能直接将 player
与 Participantstat
模型相关联的原因,因此删除 belongs_to :player
行来自 Participantstat
模型。
之后,您可以像下面这样获得带有嵌套连接的播放器,
Participantstat.includes(participant: :player).order('players.first_name')
有关详细信息,您可以使用此 link:
nested joins
我想列出属于玩家 (Players) 的游戏统计数据 (Participantstats),并根据玩家的名字 (first_name) 对列表进行排序。许多玩家玩很多游戏。连接 table 是参与者。每个参与者记录都有一个关联的(单个)参与者统计记录。
我尝试了各种不同的语法,但控制器中的这一行失败了:
@pstats = Participantstat.includes(:participant, :player).order('participant.player.first_name')
错误是
PG::UndefinedColumn: ERROR: column participantstats.player_id does not exist
如果我删除 .order 部分,它可以工作,但我自然不会在后续视图模板中以正确的顺序显示记录。
以下是模型的相关部分:
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
正如您在上面看到的,我也尝试使用委托语句(以及我已经删除的代码)来获取结果但没有成功。
这是生成的 SQL,FWIW:
: SELECT "participantstats"."id" AS t0_r0, "participantstats"."result" AS t0_r1, "participantstats"."fga" AS t0_r2, "participantstats"."fgm" AS t0_r3, "participantstats"."pts" AS t0_r4, "participantstats"."reb" AS t0_r5, "participantstats"."ass" AS t0_r6, "participantstats"."stl" AS t0_r7, "participantstats"."blk" AS t0_r8, "participantstats"."seconds" AS t0_r9, "participantstats"."score" AS t0_r10, "participantstats"."participant_id" AS t0_r11, "participants"."id" AS t1_r0, "participants"."player_id" AS t1_r1, "participants"."game_id" AS t1_r2, "participants"."created_at" AS t1_r3, "participants"."updated_at" AS t1_r4, "participants"."team" AS t1_r5, "players"."id" AS t2_r0, "players"."first_name" AS t2_r1, "players"."last_name" AS t2_r2, "players"."email" AS t2_r3, "players"."mobile" AS t2_r4, "players"."notify" AS t2_r5, "players"."created_at" AS t2_r6, "players"."updated_at" AS t2_r7, "players"."shirt" AS t2_r8, "players"."shorts" AS t2_r9, "players"."role" AS t2_r10 FROM "participantstats" LEFT OUTER JOIN "participants" ON "participants"."id" = "participantstats"."participant_id" LEFT OUTER JOIN "players" ON "players"."id" = "participantstats"."player_id" ORDER BY participants.players.first_name
您的架构在 participantstats
table 中没有 player_id 这就是为什么您不能直接将 player
与 Participantstat
模型相关联的原因,因此删除 belongs_to :player
行来自 Participantstat
模型。
之后,您可以像下面这样获得带有嵌套连接的播放器,
Participantstat.includes(participant: :player).order('players.first_name')
有关详细信息,您可以使用此 link: nested joins