原文地址为http://guides.rubyonrails.org/association_basics.html,本文非译文,只是做一下简短的介绍。(RubyChina这部分还在翻译中……)。
ActiveModel的关联系一共有以下几种
- belongs_to
- has_one
- has_many
- has_many :through
- has_one :through
- has_and_belongs_to_many
而我们通常用的关系可归类为:
- 一对一
- 一对多
- 多对一
- 多对多
对于上述四种关系,可以采用不同的表结构进行完成
belongs_to
正向属于关系,比较简单,如表A belongs_to 表B
只需要 在表A中 增加一栏以”表B名_id“的栏位即可。如果有多个栏位需要关联,则使用外键关键字进行补充即可如
class Task < ActiveRecord::Base belongs_to :user belongs_to :follower, class_name: "User", foreign_key: "follower_id" end
has_one:
反向属于关系,比如上表A和表B的关系,如果是 A--》B 是一对一,反过来 B--》 A也是一对一,那么表B有两种设计方法:
- 在表B中也增加一个表A外键使用belongs_to 关键字
- 表B中不增加任何关键字,使用has_one关键字,去关联所有表A中外键栏位与表B id一直的记录
has_many:
和has_one基本一致,一对多,多对多使用。
has_many :through :
这个特殊,拿购物车举例子, 一般购物车的设计师 cart --> cart_item --> product 这样的三层关系
cart表内是不存在任何product的外键信息,但是从关系较多来说也是一对多的。
使用has_many :through相当于借了一下cart_item中的外键关系来使用。
class Cart <ActiveRecord::Base has_many :cart_items has_many :products , through: :cart_items end class CartItem < ActiveRecord::Base belongs_to: cart has_many: products end class Product < ActiveRecord::Base end
has_one :through
同上。
has_and_belongs_to_many
除了 has_many之外另外一种多对多关系的实现。
使用Ruby Guide的例子进行说明
通过has_many :through其实也可以达到同样的效果,只不过不那么自动……
各有好处
相关推荐
本文给大家详细讲解了ruby on rails中model关联的几种形式,包括一对多,一对一,多对多。并给出了详细的示例,有需要的小伙伴可以参考下
敏捷模型 创建敏捷模型的目的在于消除为开发中的出色应用设置模型,迁移和数据库文件的烦恼。 它还提供了一个您会喜欢的,干净的,高度可维护的项目结构。...该命令将安装 sql builder和对象关系映
显示有许多贯穿Rails的实验室目标双向构建有很多贯通。 通过关联通过belongs_to,has_many和has_many查询关联。... 例如, rails g model User username:string email:string --no-test-framework 。 有关路
序列化器将定义序列化 json 的属性和关联。 class ProjectSerializer < SimpleJsonApi :: ResourceSerializer serializes :projects , model : Project attribute :id attribute :name , key : :project_...
例如, rails g model User username:string email:string --no-test-framework 。 但是,由于我们已提供了启动程序文件,因此本练习无需这样做。 标签 我们需要在PostsController更改允许的参数,以接受另一个属性...
最简单的经验法则是,如果需要将关系模型作为独立实体使用,则应设置has_many :through关系。 示例包括: 用户通过友谊有很多朋友 帖子通过标签有很多标签 第1步-创建包括联接表的模型 rails g model User name:...
rails generate noticed : model 这将生成一个通知模型和用于将用户模型与通知表相关联的说明。 :memo: 用法 要生成通知对象,只需运行: rails generate noticed:notification CommentNotification 发送通知 ...
存在的地方Rails利用SQL EXISTS条件的强大功能描述 这个gem确实完成了两件事: 选择每个具有特定关联对象的模型对象选择没有任何关联对象的每个模型对象它使用SQL 来快速完成它,并使用where_exists和where_not_...
塞特勒 ...rails g setler <model> 运行迁移: rake db: migrate 如果您使用的是protected_attributes宝石,则必须在setler模型的顶部添加attr_protected。 用法 创建/更新设置: # Method calls
显示有很多贯穿Rails的实验室 目标 双向构建有很多贯通。 通过关联通过belongs_to,has_many和has_many查询关联。... 例如, rails g model User username:string email:string --no-test-framework 。 有关路由
has_many:通过 这是关于如何使用has_many :throght创建多对多关联的完整示例has_many :throght在此示例中,我使用staff模型和client模型,其中人员有很多...$ rails generate model relationship 键入终端后打开db/
目前,Rails 开发人员必须在两个单独的模型文件中声明每个关联。 这很好,但我认为我们可以做得更好。 Whiteboard 是一种领域特定语言 (DSL),如 RSpec 或 Rake。 DSL 由两部分组成; 一个用于模型本身,另一个用于...
Fixture_Dependencies Fixture_dependencies是一种高级的夹具加载器,允许从YAML夹具加载模型以及它们...包括用于Test :: Unit的Rails和Sequel测试助手(以及用于RSpec的Sequel测试助手),它们为事务中的每个测试加载
安装 gem install autoforme链接 示范网站 博士 来源 IRC irc.freenode.net/forme 讨论区 错误追踪器 功能¶ ↑ 创建,更新,编辑和查看模型对象浏览和搜索模型对象编辑模型对象的多对多关系轻松访问关联的对象支持...
例如, rails g model User username:string email:string --no-test-framework 。 指示 这里有很多方法。查看规范,并记住在rails c运行您的代码-我保证,这将有所帮助! 城市 #city_openings方法应返回所有可用于...
例如, rails g model User username:string email:string --no-test-framework 。 指示 这里有很多方法。查看规范,并记住在rails c运行您的代码-我保证,这将有所帮助! 城市 #city_openings方法应返回所有可用于...
例如, rails g model User username:string email:string --no-test-framework 。指示这里有很多方法。查看规范,并记住在rails c运行您的代码-我保证,这将有所帮助!城市#city_openings方法应返回所有可用于整个...
例如, rails g model User username:string email:string --no-test-framework 。 指示 这里有很多方法。查看规范,并记住在rails c运行您的代码-我保证,这将有所帮助! 城市 #city_openings方法应返回所有可用于...
主动加载器自动为您的序列化程序预加载关联为虚拟属性(查询属性)指定自定义SQL代码段以可重用的方式编写自定义预加载逻辑注意:该gem的API仍然不稳定,并且可能在版本之间进行更改。 该项目使用语义版本控制,但是...