2007-07-27
在rails中,多个字段关联同一张表如何做?
关键字: 多个字段关联同一张表问题
这几天笔者投入了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部分用过[]或{},都会报错,不知如何写?
刚一开始就碰到个也许是简单的问题吧,花了点功夫没搞定,在此请教同道:
用户信息简单地存储在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部分用过[]或{},都会报错,不知如何写?
评论
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_to :operator , :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_to :operator , :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是会出问题的。
lgx522
2007-11-28
试了楼上的方法,的确有效,在此致谢!
这个问题终于有了个圆满的答案。
这个问题终于有了个圆满的答案。
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_to :operator , :class_name => 'User', :foreign_key => 'operator'
用的时候对应的用就OK了
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_to :operator , :class_name => 'User', :foreign_key => 'operator'
用的时候对应的用就OK了
yautah
2007-11-27
多态关联呀
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>
原帖中的方法其实唯有list.rhtml和show.rhtml中的显示部分有问题,加上如下“违规”代码即可解决,比如:
<% buyer_name = User.find(eq_buy_master.handler).real_name %>
<td><%=h buyer_name %></td>
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
wooo
2007-07-30
是不是可以参照这个文章,应当是需要一张关联表:
http://www.ibm.com/developerworks/cn/linux/l-activescaffold/index.html
http://www.ibm.com/developerworks/cn/linux/l-activescaffold/index.html
lgx522
2007-07-30
关联一个字段可以这样做,但这里有4个。
如果关联的是buyer,show.rhtml中显示出来的全都是:buyer关联的值,这是不对的。如果把4个都写上,则show.rhtml中显示出来的全都是最后一个关联字段的值。
如果是Hibernate的话,关联可以写在映射文件里,无论有几个字段关联,都可以做到。rails不知如何做?
如果关联的是buyer,show.rhtml中显示出来的全都是:buyer关联的值,这是不对的。如果把4个都写上,则show.rhtml中显示出来的全都是最后一个关联字段的值。
如果是Hibernate的话,关联可以写在映射文件里,无论有几个字段关联,都可以做到。rails不知如何做?
toostupid
2007-07-30
belongs_to :buyer, :class_name => 'User', :foreign_key => 'buyer'
这样如何?
不知道你问的是不是这个
。
这样如何?
不知道你问的是不是这个
。
lgx522
2007-07-30
看来这不是个“简单问题”了,各位能给个答复吗?
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 76149 次

- 详细资料
搜索本博客
最新评论
-
OO和SQL,应该携手共进
世界本来就是一个平衡体, 分析问题也要如此心态
-- by spiritfrog -
OO和SQL,应该携手共进
本来就是如此,各有所长嘛!
-- by hatedance -
Spring性能小测,参其它技 ...
laiseeme 写道hibernate没问题 有问题的是用hibernate的 ...
-- by xellos -
Spring性能小测,参其它技 ...
王者之剑 写道我觉得这个贴子应该成为精华贴, 如果将这类问题老是搞得看不见的话, ...
-- by davidcen -
Spring性能小测,参其它技 ...
jander 写道icewubin 写道williamy 写道 2。上面谁说OR ...
-- by icewubin






评论排行榜