论坛首页 Ruby版 rails

再次提出关于表间关联 自引用 的问题.

浏览 598 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2007-11-27
首先我发表我的抗议: 之前在论坛发贴咨询过, 不知道这里的管理员到底怎么定义问题的难易, 轻易把问题划为"入门"问题. 真不知道有多入门的问题, 以至于大部分"高手"不愿意停留下脚步对此进行关注. 这个论坛Ruby本来就算不上人气热闹, 还按不知道哪里的管理员的喜好来强分层次, 以显示自己的水平之高, 品味之独特. 实在好笑. 类似现在留在版面的 http://www.javaeye.com/topic/143573 主题: 打折,促销,VIP,规则怎么处理? 如何获取当前function的名字 等等, 这在我看来何尝不是菜鸟的问题? 入门问题? 难道他们的帖子数就代表了他们能在非入门区发入门问题? 真是莫名其妙之极.

问题确实很简单, 一个model: User, 用户可以拥有自己的好友, 好友也是User. 这属于多对多的问题. 很好, 问题很简单, 很清楚, 多对多嘛, 换个语言, J2EE, .NET, 几句话的问题就能解决. 但在ROR里面真的简单吗?

首先, 你想到的也许是一个关系表:
users_users
没错
然后你继续考虑增加关系.
你继续写
has_and_belongs_to_many :friends, :class_name => "User", :foreign_key => "friend_id"
这不就成了么?
不成.
当你执行 user.friends << User.create(:name => xxx) 后, user的id会映射到"friend_id"中, 你的朋友ID却存入了"user_id"之中. 离你的本意相差很远. 不过勉强它能运行了是不, 我们求其一些, 把friends更改为friended_with让自己别扭一下, 这总算是能工作了. 不过这会让我们非常之不享受.

好我们稍稍衍生一下问题.

我们现在不要那个关联表了, 它表达的意思不够明显, 我们要增加一个字段, 我们把users_users表给去了, 替换为friendships表, 我们增加了大量的附属信息. 例如用户之间的关系啊(他们到底是朋友还是仇人还是一个人想要成为另一个人的朋友, 但是另一个人并不在乎之类的)我们该怎么办呢??

真心向各位高人请教关于自引用的处理方式.
   
时间:2007-11-27
我会这样设计:
class User < ActiveRecord::Base
  has_many :friendships, :dependent => :destroy
  has_many :friends, :through => :friendships
end

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => 'User',  :foreign_key => 'friend_id'
end

@user = User.find(1)
@friend = User.find(2)
@user.friends << @friend
@friend.friends << @user
   
0 请登录后投票
时间:2007-11-27
rainchen是正解。另外见这里:http://www.railsforum.com/viewtopic.php?pid=7958 你这个帖子应该不算简单,概念上有点绕,不过可以很容易google到答案。版规里写了能google到的问题就不要问了,所以可能有人根据这个投的入门贴?不一定是管理员操作的。
   
0 请登录后投票
时间:2008-06-22
leondu 写道
rainchen是正解。另外见这里:http://www.railsforum.com/viewtopic.php?pid=7958 你这个帖子应该不算简单,概念上有点绕,不过可以很容易google到答案。版规里写了能google到的问题就不要问了,所以可能有人根据这个投的入门贴?不一定是管理员操作的。

很容易google到?你输入的是什么关键字呢?除了这个帖子,我没google别的有用的信息嘛
   
0 请登录后投票
时间:2008-06-22
看一下rails的开源项目substract,一切基本问题都解决
   
0 请登录后投票
论坛首页 Ruby版 rails

跳转论坛:
JavaEye推荐