【问题标题】:Rails Relationship: Referencing the same table twice within a many-to-many relationshipRails 关系:在多对多关系中两次引用同一个表
【发布时间】:2013-01-18 15:13:09
【问题描述】:

我对 Rails 还很陌生,并试图弄清楚关系。

我试图建模的数据如下: 活动是人们玩游戏的聚会。 一个事件被记录在多个视频中。 一个视频包含多个游戏集。 一个 GameSet 有两个玩家,player_one 和 player_two。

因为一个事件有很多视频,一个视频有很多游戏集,我觉得我应该能够声明一个 has_many :through 关系以直接从事件到游戏集。另外,我应该可以直接从一个玩家进入他参与的所有 GameSet。

这是我所拥有的:

class Event < ActiveRecord::Base
  attr_accessible :event_date, :event_name, :event_number, :city, :state, :game_sets, :videos
  has_many :videos
  has_many :game_sets, :through => :videos
end

class Video < ActiveRecord::Base
  attr_accessible :name, :url, :event, :game_sets
  belongs_to :event
  has_many :game_sets
end

class GameSet < ActiveRecord::Base
  attr_accessible :player_one, :player_two, :video
  belongs_to :video
  has_one :player_one, :class_name => "Player"
  has_one :player_two, :class_name => "Player"
end

class Player < ActiveRecord::Base
  attr_accessible :first_name, :handle, :home_city, :home_state, :last_name, :tag
  has_and_belongs_to_many :game_sets
end

但是当我尝试执行如下代码时:

GameSet.find_by_id(1).player_one 

我得到以下异常。

?[1m?[36mGameSet Load (0.0ms)?[0m  ?[1mSELECT "game_sets".* FROM "game_sets" WHERE "game_sets"."id" = 1 LIMIT 1?[0m  ?[1m?[35mPlayer Load (1.0ms)
?[0m  SELECT "players".* FROM "players" WHERE "players"."game_set_id" = 1 LIMIT 1SQLite3::SQLException: no such column: players.game_set_id: SELECT  "players".* FROM "players"  WHERE "players"."game_set_id" = 1 LIMIT 1ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: players.game_set_id: SELECT  "players".* FROM "players"  WHERE "players"."game_set_id"= 1 LIMIT 1

我终其一生都无法弄清楚我做错了什么。任何帮助表示赞赏。

【问题讨论】:

    标签: ruby-on-rails has-many-through rails-activerecord has-and-belongs-to-many


    【解决方案1】:

    你在 GameSet 和它的玩家之间的关系是错误的。假设您有两个整数列,其中包含 player_one 和 player_two 的 id,则关系应该是 belongs_to 而不是 has_one。否则,这意味着它是具有 game_set_id 以链接回 GameSet 的 Player。

    【讨论】:

    • 你知道,这是有道理的。我想我很难将标记“has_one”及其含义与我对现实世界中关系的看法分开。在现实世界中,我认为游戏有玩家,而不是游戏属于其中的玩家。但实际上我应该从数据库世界中所代表的意义上考虑关系。
    • 只有在某些情况下才有意义。例如,当老师通过课程有很多学生时,通常很清楚。课程属于教师。学生拥有并属于许多课程。
    • 我会的。不过,我还没有机会尝试一下。但我很乐观。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多