cma*_*han 6 activerecord ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)
我的连接表的数据库迁移:
create_table :game_users, :id => false do |t|
t.column :game_id, :integer
t.column :user_id, :integer
t.column :player_index, :integer
end
Run Code Online (Sandbox Code Playgroud)
我不太确定我得到了这一切,请帮我查一下我的事实:
依赖=>:destroy是否正确?如果游戏或用户被销毁,我希望删除'game_users'连接表条目 - 但我不希望删除用户如果删除游戏,反之亦然......?
uniq字段应该表示游戏仅包含唯一用户,并且用户仅包含唯一游戏.那是对的吗?
像以前一样进行数据库迁移:id => false.这仍然是正确的做法吗?我试图在控制台中摧毁一个游戏,并对丢失的内容进行投诉......所以我猜不到并试图理解为什么.
我发现rails活动记录关联非常混乱.我想他们不应该是!
1:是的,这是正确的
如果为true,则将从集合中省略重复项.与以下内容结合使用:通过.
所以,是的,如果您的目标不是在用户的游戏集合中获得相同的游戏,也不是在Game的用户集合中获得相同的用户,这是正确的.这一切都在这里解释.
但是,它不会阻止创建重复的GameUser.为此,您需要在GameUser模型中使用validates_ uniqueness _of:
class GameUser < ActiveRecord::Base
validates_uniqueness_of :game_id, :scope => :user_id
end
Run Code Online (Sandbox Code Playgroud)
3:不,你不想再使用:id => false了.通过从has_and_belongs_to_many切换到has_many:through,您已经将多对多连接表提升为完整模型 - GameUser - 它需要自己的id.
虽然它已经老了,但这仍然是理解has_many:through的好文章.
| 归档时间: |
|
| 查看次数: |
3792 次 |
| 最近记录: |