gpt4 book ai didi

ruby-on-rails - has_many :through questions

转载 作者:行者123 更新时间:2023-12-04 06:13:23 28 4
gpt4 key购买 nike

我以前使用 has_and_belongs_to_many,并已转换为 has_many :through。下面是它如何查找可以有很多用户玩的游戏列表。有了这个,我可以做 game.users 和 user.games ....:

class Game < ActiveRecord::Base
has_many :game_users, :dependent => :destroy
has_many :users, :through => :game_users, :uniq => true
end

class User < ActiveRecord::Base
has_many :game_users, :dependent => :destroy
has_many :games, :through => :game_users, :uniq => true
end

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

我的连接表的数据库迁移:
create_table :game_users, :id => false do |t|
t.column :game_id, :integer
t.column :user_id, :integer
t.column :player_index, :integer
end

我不太确定我得到了所有这些,请帮我检查我的事实:
  • 依赖 => :destroy 是否正确?如果游戏或用户被破坏,我希望删除“game_users”连接表条目 - 但我不希望用户在游戏被删除时被删除,反之亦然.....?
  • uniq 字段应该是说游戏只包含唯一用户,而用户只包含唯一游戏。那是对的吗?
  • 之前的数据库迁移有 :id => false。这仍然是正确的做法吗?我尝试在控制台中销毁游戏,并收到有关丢失 ID 的投诉......所以我猜不是,并试图了解原因。

  • 我发现 rails 事件记录关联非常困惑。我想他们不应该是!

    最佳答案

    1:是的,这是正确的

    2:来自documentation on uniq :

    If true, duplicates will be omitted from the collection. Useful in conjunction with :through.



    所以,是的,如果您的目标不是在用户的游戏收藏中获得相同的游戏,也不是在游戏的用户收藏中获得相同的用户,那是正确的。都解释了 here .

    但是,它不会阻止创建重复的 GameUser。为此,您需要使用 validates_ uniqueness _of在 GameUser 模型中:
    class GameUser < ActiveRecord::Base
    validates_uniqueness_of :game_id, :scope => :user_id
    end

    3:不,你不想再使用 :id => false 了。通过从 has_and_belongs_to_many 切换到 has_many :through,您已将多对多连接表提升为完整模型 - GameUser - 这需要自己的 ID。

    虽旧, this仍然是理解 has_many :through 的好文章。

    关于ruby-on-rails - has_many :through questions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1710787/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com