我以前使用has_and_belongs_to_many,并已转化为has_many:通过。这里是它看起来如何一清单的游戏,可以有许多的用户播放。有了这个,我可以做游戏。用户和用户。游戏。:

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. 是的依赖=>:摧毁否正确?我想的'game_users'参加表进入被删除,如果任的游戏,或用户是销毁--但我不想让用户可以删除,如果删除,并且反之亦然。。...?

  2. 该uniq场是应该说那游戏仅含有独特的用户和用户只有独特的游戏。是正确的?

  3. 该数据库迁移之前有:id=>错误的。是,仍然做的事情?我试图在控制台摧毁一个游戏,并得到了投诉有关的失踪id...所以我猜不及想明白为什么。

我找到轨道活动的记录,协会非常混乱。我猜他们不应该!

有帮助吗?

解决方案

1:是的,这是正确的

2:从 文件uniq:

如果真是重复的,将省略 从收集。有用 结合:通过。

所以,是的,如果你的目的不是得到相同的游戏的用户的游戏-收集也不相同的用户在游戏的用户收集,这是正确的。这是所有的解释 在这里,.

它不会,但是,防止重复GameUsers从被创建。对于这一点,你会需要使用 validates_的独特性_of 在GameUser模型:

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

3:不,你不想使用:id=>假更多。通过交换从has_and_belongs_to_many到has_many:通过,你已经促进了你多加入表一个完整模型的GameUser-这就需要自己的身份证。

虽然它是旧的, 仍然是一个很好的文章对于理解has_many:通过。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top