`
lgx522
  • 浏览: 124319 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

在rails中,多个字段关联同一张表如何做?

    博客分类:
  • Ruby
阅读更多
这几天笔者投入了ROR的实践中,开始重写2年前用appfuse(Spring+Hibernate+JSF)写的一个物资管理小系统。原因无它,自产自用,业务逻辑成熟,并积累了一定的数据量。

刚一开始就碰到个也许是简单的问题吧,花了点功夫没搞定,在此请教同道:

用户信息简单地存储在users表中,主要字段为:id,username,password,real_name
设备购买主记录表为eq_buy_master,涉及到关联的字段为:manager,buyer,accepter,operator
因外键都关联到users,故无法使用超方便的user_id。
于是在User中设has_many,写法为:
has_many :eqbuymaster
EqBuyMaster中设belongs_to,并仿“Agile Rails”中第231页的做法,如下写:
belongs_to :user, :class_name => 'User', :foreign_key => 'manager'
于是在_form.rhtml中用select的写法为:
<%= collection_select(:eq_buy_master, :manager, @all_users, :id, :real_name) %>
在show.rhtml中显示realname的写法为:
<%= @eq_buy_master.user.real_name %></p>
使用正常。

但此处有四个字段都关联,这种做法在_form.rhtml中是正常的,但show.rhtml中显示出来的全都是:manager关联的值,显然不对。在EqBuyMaster中的belongs_to部分用过[]或{},都会报错,不知如何写?
分享到:
评论
11 楼 lgx522 2007-12-26  
sun201200204 写道

EqBuyMaster中设belongs_to,并仿“Agile Rails”中第231页的做法,如下写:
belongs_to :manager, :class_name => 'User', :foreign_key => 'manager'
belongs_to :buyer, :class_name => 'User', :foreign_key => 'buyer'
belongs_to :accepter, :class_name => 'User', :foreign_key => 'accepter'
belongs_toperator , :class_name => 'User', :foreign_key => 'operator'
用的时候对应的用就OK了


其实belongs_to部分最正确的写法是:
belongs_to :manager, :class_name => 'User', :foreign_key => 'manager_user_id'
belongs_to :buyer, :class_name => 'User', :foreign_key => 'buyer_user_id'
belongs_to :accepter, :class_name => 'User', :foreign_key => 'accepter_user_id'
belongs_toperator , :class_name => 'User', :foreign_key => 'operator_user_id'
eq_buy_masters表中的外键也就相应为manager_user_id,buyer_user_id,accepter_user_id,operator_user_id

这样的话,不论在list中以manager.real_name引用,还是在form中以
<%= collection_select :eq_buy_master, :manager_user_id, @all_users, :id, :real_name %>来用都正常。否则用collection_select是会出问题的。
10 楼 lgx522 2007-11-28  
试了楼上的方法,的确有效,在此致谢!

这个问题终于有了个圆满的答案。
9 楼 sun201200204 2007-11-28  
在User中设has_many,写法为:
has_many :mastermanagers, :class_name => 'EqBuyMaster', :foreign_key => 'manager'
has_many :masterbuyers, :class_name => 'EqBuyMaster', :foreign_key => 'buyer'
has_many :masteraccepters, :class_name => 'EqBuyMaster', :foreign_key => 'accepter'
has_many :masteroperators, :class_name => 'EqBuyMaster', :foreign_key => 'operator'
EqBuyMaster中设belongs_to,并仿“Agile Rails”中第231页的做法,如下写:
belongs_to :manager, :class_name => 'User', :foreign_key => 'manager'
belongs_to :buyer, :class_name => 'User', :foreign_key => 'buyer'
belongs_to :accepter, :class_name => 'User', :foreign_key => 'accepter'
belongs_toperator , :class_name => 'User', :foreign_key => 'operator'
用的时候对应的用就OK了
8 楼 yautah 2007-11-27  
多态关联呀
7 楼 lgx522 2007-11-27  
developworks上的方法的确是可以解决的,但设计上的增加不少复杂性,于是本人在view层做了点“违规”的小手脚,也就解决了。

原帖中的方法其实唯有list.rhtml和show.rhtml中的显示部分有问题,加上如下“违规”代码即可解决,比如:
<% buyer_name = User.find(eq_buy_master.handler).real_name %>
<td><%=h buyer_name %></td>
6 楼 lgx522 2007-07-30  
谢了!
5 楼 whygod 2007-07-30  
下面代码是否可以参考一下:
class User < ActiveRecord::Base
   belongs_to :organization
end
class Organization < ActiveRecord::Base
  has_many :projects
  has_many :users
end
class Project < ActiveRecord::Base
  belongs_to :organization
  has_many :projects_users
  has_many :administrators, :through => :projects_users, :source => :user,
           :conditions => "projects_users.role_type = 3"
  has_many :managers, :through => :projects_users, :source => :user,
           :conditions => "projects_users.role_type = 2"
  has_many :workers, :through => :projects_users, :source => :user,
           :conditions => "projects_users.role_type = 1"
end
class ProjectsUser < ActiveRecord::Base
  belongs_to :project
  belongs_to :user
end
4 楼 wooo 2007-07-30  
是不是可以参照这个文章,应当是需要一张关联表:

http://www.ibm.com/developerworks/cn/linux/l-activescaffold/index.html
3 楼 lgx522 2007-07-30  
关联一个字段可以这样做,但这里有4个。

如果关联的是buyer,show.rhtml中显示出来的全都是:buyer关联的值,这是不对的。如果把4个都写上,则show.rhtml中显示出来的全都是最后一个关联字段的值。

如果是Hibernate的话,关联可以写在映射文件里,无论有几个字段关联,都可以做到。rails不知如何做?
2 楼 toostupid 2007-07-30  
belongs_to :buyer, :class_name => 'User', :foreign_key => 'buyer'

这样如何?
不知道你问的是不是这个
1 楼 lgx522 2007-07-30  
看来这不是个“简单问题”了,各位能给个答复吗?

相关推荐

Global site tag (gtag.js) - Google Analytics