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

在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  
看来这不是个“简单问题”了,各位能给个答复吗?

相关推荐

    Rails项目源代码

    在这个项目中,`User`和`Image`模型可能会与数据库中的相应表关联,通过定义属性和关系,如`has_many :images`表示一个用户可以拥有多个图片。 5. **路由配置**: Rails的路由系统将URL映射到控制器的行动上,如`/...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **示例**:例如,在博客系统中,一篇文章可以有多个评论,这就是典型的“一对多”关系。 #### 四、查询 - **方法**:使用Active Record的方法来进行数据库查询,如`find`、`where`、`joins`等。 - **优化**:...

    Ruby on Rails 指南 v5.0.1 中文版

    - **创建复杂表单**:介绍如何构建包含多个嵌套字段的复杂表单。 #### ActionController概览 - **控制器的作用**:解释控制器在MVC架构中的角色。 - **控制器命名约定**:说明控制器命名的规则和约定。 - **方法和...

    Rails 101S

    - 示例:通过`rails generate scaffold Topic title:string description:text`创建一个Topic模型及其关联的CRUD操作。 - **整合Bootstrap与版型设置**:介绍如何将Bootstrap框架集成到Rails应用中,并设置基础版型...

    Ruby-RailsAdmin一个Rails引擎提供了一个易于使用的界面来管理您的数据

    3. 模型关联管理:RailsAdmin 支持处理多对一、一对一、多对多等复杂关联关系,可以方便地在管理界面中展示和操作关联数据。 4. 自定义视图:RailsAdmin 允许开发者通过简单的配置,定制列表视图、表单视图以及其他...

    ruby on rails中Model的关联详解

    这里的 `spouse_id` 是 `Person` 表中的一个字段,用于关联其配偶。 #### 三、多对多 (Many-to-Many) **示例场景**:考虑一个学生可以选修多门课程,同时一门课程也可以被多名学生选修的情况。 **数据库结构**: ...

    Ruby-MongoModel针对MongoDB的RubyORM框架兼容Rails3

    6. **继承支持**:与ActiveRecord类似,MongoModel支持单继承,一个父类可以有多个子类,子类会继承父类的字段和方法。 7. **关联**:尽管MongoDB不像关系型数据库那样强调关系,但MongoModel还是提供了基本的关联...

    rails2.0下实现《rubyonrails》中的mybook实例

    4. **模型和迁移**:在Rails中,我们使用ActiveRecord模型来定义数据表结构。例如,如果你有一个`Book`模型,可以创建一个迁移文件来创建`books`表: ``` bundle exec rails generate migration CreateBooks title...

    Rails中应用Ext.tree:以中国的省市地区三级联动选择为例

    在Rails项目中,我们通常会创建一个模型来处理这些数据,比如创建一个`City`模型,包含`province_id`、`name`等字段,代表城市与所属省份的关系。`province_id`是外键,关联到`Province`模型的主键。同样,我们还...

    rails/简易报告整理网页版

    综上所述,“rails/简易报告整理网页版”项目展示了Rails基础应用的构建,涵盖了从数据模型、用户交互到数据可视化等多个核心环节,对于初学者来说,这是一个很好的学习和实践案例。通过深入理解这些知识点,开发者...

    recurse-delete:Rails gem 在没有 N+1 的情况下递归删除自身和所有依赖关联

    ##递归删除当您在 Rails 中调用 Record.destroy 时,它会实例化其所有关联(即 :dependent =&gt; :destroy)并在每个关联上调用 destroy。 这是一个 N + 1,如果将关联设置为 :dependent =&gt; :delete_all,则可以删除...

    ruby on rails 实例代码

    例如,一个用户可以有多个帖子(posts): ```ruby class User has_many :posts end class Post belongs_to :user end ``` 在这个例子中,可以通过用户对象访问其关联的帖子,如`user.posts`。 TDD(Test-...

    Ruby-ActsAsTennant通过一个共享数据库的策略来为一个Rails应用添加多租户支持

    在多租户架构中,一个单一的应用程序可以服务于多个独立的客户(称为租户),每个租户的数据被隔离,彼此不可见。Acts As Tennant库通过共享数据库的策略实现这一目标,而不是为每个租户创建单独的数据库。 描述中...

    Messaging with Rails

    在Rails中,我们需要创建一个`Message`模型,包含必要的字段如发送者(sender)、接收者(recipient)、消息内容(content)以及时间戳(created_at)。此外,可能还需要考虑消息的状态(如未读或已读),这可以通过...

    Complex Rails system_Rails_优化_

    总结,优化Rails系统需要全面考虑数据库、缓存、代码、服务器配置等多个层面。理解系统的工作原理,针对性地进行优化,是提升复杂Rails系统性能的关键。在实践过程中,持续监控、分析和调整,才能确保应用始终处于...

    Apress Pro ActiveRecord Databases with Ruby and Rails.pdf

    ### ActiveRecord在Ruby与Rails中的应用 #### 一、前言 《Pro ActiveRecord:Databases with Ruby and Rails》这本书深入探讨了如何使用ActiveRecord这一对象关系映射(Object Relational Mapping, ORM)工具来...

    Pro ActiveRecord Databases with Ruby and Rails.pdf

    4. **多数据库支持**: 支持连接多个数据库,并能够在不同的数据库之间切换。 5. **安全性**: ActiveRecord提供了安全措施来防止SQL注入攻击。 #### 六、实战案例分析 本书还包含了许多实际应用场景的案例研究,例如...

    Rails Recipes Final.pdf

    书中提到的多个商标均受到保护,如“The Pragmatic Starter Kit”、“The Pragmatic Programmer”等。 - **编写态度**:作者在准备本书时采取了严谨的态度,但在使用本书包含的信息(包括程序列表)时,出版社不对...

    Agile Web Development with Rails中文版 3rd Edition

    通过ActiveRecord,开发者可以直接在模型类中定义表结构、字段、关联关系等,而无需编写复杂的SQL语句。 **2.3 ActionPack:视图与控制器** ActionPack提供了构建控制器和视图所需的工具。它包含了一系列帮助器...

Global site tag (gtag.js) - Google Analytics