每天一剂Rails良药之Many to Many Relationships Where the Relationship Itself Has Data
通常我们面临多对多时的处理方法是建立一个关系表,然后has_and_belongs_to_many
如果我们的关系表有其他属性,我们通过声明join table来放置关系表的其他属性
而当关系表本身具有其他属性时,我们可以通过join model来处理
如Magazine和Reader的多对多关系表Subscription:
def self.up
create_table :magazines do |t|
t.column :title, :string
end
create_table :readers do |t|
t.column :name, :string
end
create_table :subscriptions do |t|
t.column :magazine_id, :integer
t.column :reader_id, :integer
t.column :last_renewal_on, :date
t.column :length_in_issues, :integer
end
end
我们建立了magazines、readers和关系表subscriptions的migration,其中关系表中有两个一般属性
然后我们可以这样定义它们三者的model:
class Subscription < ActiveRecord::Base
belongs_to :magazine
belongs_to :reader
end
class Magazine < ActiveRecord::Base
has_many :subscriptions
has_many :readers, :through => :subscriptions
end
class Reader < ActiveRecord::Base
has_many :subscriptions
has_many :magazines, :through => :subscriptions
end
这样我们通过Subscription这个join model建立了Magazine和Reader的多对多关系
magazine = Magazine.create(...)
reader = Reader.create(...)
subscription = Subscription.create(...)
magazine.subscriptions << subscription
reader.subscriptions << subscription
subscription.save
这样我们就保存了一个Subscription对象我们可以通过magazine.readers或者reader.magazines查看关联的对象
我们还可以给出一些has_many的options,例如得到半年的subscribers:
class Magazine < ActiveRecord::Base
has_many :subscriptions
has_many :readers, :through => :subscriptions
has_many :semiannual_subscribers,
:through => :subscriptions,
:class_name => "Reader",
:conditions => ['length_in_issues = 6']
end
这样我们可以通过magazine.semiannual_subscribers来得到半年的subscribers
分享到:
相关推荐
3. 模型关联管理:RailsAdmin 支持处理多对一、一对一、多对多等复杂关联关系,可以方便地在管理界面中展示和操作关联数据。 4. 自定义视图:RailsAdmin 允许开发者通过简单的配置,定制列表视图、表单视图以及其他...
《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...
MVC是Rails的核心架构之一,这一章节将详细介绍这三个组件的作用和相互关系。模型负责与数据库交互,管理数据;视图用于展示数据给用户;控制器则处理用户请求,协调模型和视图之间的操作。了解并正确运用MVC模式是...
《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别是那些想要从零开始掌握这项技术的新手。 #### 二、...
模型部分会涉及ActiveRecord的生命周期,包括创建、读取、更新和删除(CRUD)操作,以及关联(Associations)如一对一、一对多、多对多等,这些关联让数据间的复杂关系得以轻松管理。 此外,教程还会涉及表单...
在这个项目中,`User`和`Image`模型可能会与数据库中的相应表关联,通过定义属性和关系,如`has_many :images`表示一个用户可以拥有多个图片。 5. **路由配置**: Rails的路由系统将URL映射到控制器的行动上,如`/...
- **定义**:关联是指定义模型之间的关系,如一对一、一对多等。 - **示例**:例如,在博客系统中,一篇文章可以有多个评论,这就是典型的“一对多”关系。 #### 四、查询 - **方法**:使用Active Record的方法来...
ERD是数据库设计的基础,它通过图形化方式展示了各个实体(表)之间的关系,包括一对一、一对多、多对多等关联。在Rails框架中,这些实体通常对应于Rails的模型(models),而关联则通过模型之间的`has_many`、`...
rails-i18n, 用于收集 Ruby on Rails i18n 环境数据以及其他有趣的Rails 相关 i18n 内容的存储库 Rails 语言环境数据存储库 中心收集区域设置数据,以便在 ruby 上使用。 gem-安装添加到你的Gemfile:gem 'rails-i18n...
标题 "Rails" 指的是 Ruby on Rails,一个开源的Web应用程序框架,它基于Ruby编程语言,遵循MVC(模型-视图-控制器)架构模式。Rails由David Heinemeier Hansson在2004年创建,其设计理念是强调代码的简洁性、DRY...
Rails 作为 Ruby 的主要应用框架之一,两者密切相关。 在压缩包的文件名称列表中,只有一个条目 "rails",这可能意味着压缩包内包含了 Rails 框架的核心文件,如 gemspec 文件、库文件、初始化脚本等。开发者可以...
在Ruby on Rails框架中,开发人员经常选择使用关系型数据库如SQLite、PostgreSQL或MySQL来存储数据。然而,随着NoSQL数据库的兴起,MongoDB因其灵活性和非结构化数据处理能力,也成为了许多Web应用程序的选择。本文...
- **Active Record Associations**:深入探讨Active Record的关联关系管理,如一对一、一对多等关联类型。 #### 总结 《Rails 101S》不仅是一本适合新手入门的教程,也是进阶开发者的好帮手。通过实践这些基础知识...
创建购物车模型(Cart)和商品模型(Product),定义它们之间的关系,如多对多关系,通过一个关联表记录每个购物车包含的商品及其数量。使用`has_and_belongs_to_many`或`has_many :through`关联来实现这一关系。 ...
Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...
Rails 提供了一系列内置的工具和约定,如ActiveRecord(ORM,对象关系映射),使得数据库操作变得简单。ActiveRecord允许开发者用Ruby代码定义数据库表的结构,以及与表相关的操作,如创建、读取、更新和删除(CRUD...
开发者可以定义属性、关联(如一对一、一对多、多对多)、以及验证规则,确保数据的完整性和一致性。 3. **ActionController**:控制器层处理HTTP请求,并将数据传递给视图进行渲染。它也负责调用模型来获取或更新...
本书《Component-Based Rails Applications》主要介绍了如何使用Rails引擎(Rails Engine)进行基于组件的Rails应用开发,以及如何对应用程序的大型模块进行拆分和模块化。以下是书中一些核心知识点的详细说明: 1....