has_many:通过问题

时间:2009-11-10 20:01:50

标签: ruby-on-rails activerecord has-many-through

我之前使用过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

我不太确定我能得到这一切,请帮我查一下我的事实:

  1. 依赖=是&gt; :毁灭正确吗?如果游戏或用户被销毁,我希望删除'game_users'连接表条目 - 但我不希望删除用户如果删除游戏,反之亦然......?

    < / LI>
  2. uniq字段应该表示游戏仅包含唯一用户,并且用户仅包含唯一游戏。这是对的吗?

  3. 以前的数据库迁移有:id =&gt;假。这仍然是正确的做法吗?我在控制台中试图摧毁一个游戏,并且对丢失的内容进行了投诉......所以我猜不到并试图了解原因。

  4. 我发现rails活动记录关联非常混乱。我猜他们不应该是!

1 个答案:

答案 0 :(得分:5)

1:是的,这是正确的

2:来自documentation on uniq

  

如果为true,将省略重复项   来自收藏。有用的   结合:通过。

所以,是的,如果您的目标不是在用户的游戏集合中获得相同的游戏,也不是在Game的用户集合中获得相同的用户,那是正确的。这些都解释了here

但是,它不会阻止创建重复的GameUser。为此,您需要在GameUser模型中使用validates_ uniqueness _of

class GameUser < ActiveRecord::Base
  validates_uniqueness_of :game_id, :scope => :user_id
end

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

虽然它已经过时了,this仍然是理解has_many的好文章:通过。