0

我很难找到在 Rails 中设置模型和关系的最佳方法,因为我需要 Rails、mvc 和活动记录约定。

考虑三个表:

用户

rails generate scaffold User username:string email:string password:string

游戏

rails generate scaffold Game user_id:integer name:string description:string type:string

游戏名册

rails generate scaffold GameRoster user_id:integer game_id:integer level:integer status:string

用户可以创建游戏(这是游戏表中“所有者”的 user_id 字段)。创建者可能在也可能不在实际游戏中(game_rosters 表中创建者的可选记录)。

每个游戏都有许多不属于游戏的用户(位于 game_rosters 中)。

所以我想我应该为用户建立两种关系——has_many: games他们创建has_many: games, through: game_rosters的游戏,以及用户参与的游戏。

class User < ActiveRecord::Base
    has_many :game_rosters
    has_many :games, through: :game_rosters

    has_many :games
end

class Game < ActiveRecord::Base
    has_many :game_rosters
    has_many :users, through: :game_rosters
end

class GameRoster < ActiveRecord::Base
    belongs_to :user
    belongs_to :game
end

但我不确定这是否是正确的设置,我无法让它正常工作。我有上述设置,以及以下用于尝试打印结果的设置:

<p>
  <strong>My Games:</strong>
  <% @user.games.each do |game| %>
  <br><%= game.name %>
  <% end %>
</p>


<p>
  <strong>Participants:</strong>
  <% @game.users do |user| %>
  <br><%= game.user.name %>
  <% end %>
</p>

我可以从关系中打印“我的奥运会” has_many: games,但不能从关系中打印“参与者” has_many :through

任何方向将不胜感激,谢谢。

4

2 回答 2

3

还想补充一点,模型games中的不同关联不应使用相同的名称。User因为最后一个覆盖了第一个。像这样的东西应该工作。

class User < ActiveRecord::Base

    has_many :owned_games, :foreign_key => "user_id", :class_name => "Game"

    has_many :game_rosters
    has_many :games, through: :game_rosters


end

class Game < ActiveRecord::Base

    belongs_to :owner, :foreign_key => "user_id", :class_name => "Game"

    has_many :game_rosters
    has_many :users, through: :game_rosters
end

class GameRoster < ActiveRecord::Base
    belongs_to :user
    belongs_to :game
end

访问用户的关联

 # All the games a user is involved in 
 user.games

 # All the games a user owns
 user.owned_games

访问游戏的关联

 #All the users involved in the game
 game.users

# Owner of the game
 game.owner
于 2013-09-18T22:28:38.480 回答
1

尝试:

<p>
  <strong>Participants:</strong>
  <% @game.users.each do |user| %>
  <br><%= user.name %>
  <% end %>
</p>
于 2013-09-18T22:14:47.413 回答