`
hideto
  • 浏览: 2666853 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

每天一剂Rails良药之具有数据的多对多关系

    博客分类:
  • Ruby
阅读更多
每天一剂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
分享到:
评论

相关推荐

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

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

    rails2-sample

    MVC是Rails的核心架构之一,这一章节将详细介绍这三个组件的作用和相互关系。模型负责与数据库交互,管理数据;视图用于展示数据给用户;控制器则处理用户请求,协调模型和视图之间的操作。了解并正确运用MVC模式是...

    Rails 101 入门电子书

    《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别是那些想要从零开始掌握这项技术的新手。 #### 二、...

    Rails入门教程一(翻译).pdf

    模型部分会涉及ActiveRecord的生命周期,包括创建、读取、更新和删除(CRUD)操作,以及关联(Associations)如一对一、一对多、多对多等,这些关联让数据间的复杂关系得以轻松管理。 此外,教程还会涉及表单...

    Rails项目源代码

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

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **定义**:关联是指定义模型之间的关系,如一对一、一对多等。 - **示例**:例如,在博客系统中,一篇文章可以有多个评论,这就是典型的“一对多”关系。 #### 四、查询 - **方法**:使用Active Record的方法来...

    Ruby-RailsErd为Rails应用程序生成实体关系图

    ERD是数据库设计的基础,它通过图形化方式展示了各个实体(表)之间的关系,包括一对一、一对多、多对多等关联。在Rails框架中,这些实体通常对应于Rails的模型(models),而关联则通过模型之间的`has_many`、`...

    rails-i18n, 用于收集 Ruby on Rails i18n 环境数据以及其他有趣的Rails 相关 i18n 内容的存储库.zip

    rails-i18n, 用于收集 Ruby on Rails i18n 环境数据以及其他有趣的Rails 相关 i18n 内容的存储库 Rails 语言环境数据存储库 中心收集区域设置数据,以便在 ruby 上使用。 gem-安装添加到你的Gemfile:gem 'rails-i18n...

    Rails

    标题 "Rails" 指的是 Ruby on Rails,一个开源的Web应用程序框架,它基于Ruby编程语言,遵循MVC(模型-视图-控制器)架构模式。Rails由David Heinemeier Hansson在2004年创建,其设计理念是强调代码的简洁性、DRY...

    rails2.3.2

    Rails 作为 Ruby 的主要应用框架之一,两者密切相关。 在压缩包的文件名称列表中,只有一个条目 "rails",这可能意味着压缩包内包含了 Rails 框架的核心文件,如 gemspec 文件、库文件、初始化脚本等。开发者可以...

    ruby on rails对mongodb的操作

    在Ruby on Rails框架中,开发人员经常选择使用关系型数据库如SQLite、PostgreSQL或MySQL来存储数据。然而,随着NoSQL数据库的兴起,MongoDB因其灵活性和非结构化数据处理能力,也成为了许多Web应用程序的选择。本文...

    Rails 101S

    - **Active Record Associations**:深入探讨Active Record的关联关系管理,如一对一、一对多等关联类型。 #### 总结 《Rails 101S》不仅是一本适合新手入门的教程,也是进阶开发者的好帮手。通过实践这些基础知识...

    rails敏捷开发的购物车系统

    创建购物车模型(Cart)和商品模型(Product),定义它们之间的关系,如多对多关系,通过一个关联表记录每个购物车包含的商品及其数量。使用`has_and_belongs_to_many`或`has_many :through`关联来实现这一关系。 ...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    railsAPI

    Rails 提供了一系列内置的工具和约定,如ActiveRecord(ORM,对象关系映射),使得数据库操作变得简单。ActiveRecord允许开发者用Ruby代码定义数据库表的结构,以及与表相关的操作,如创建、读取、更新和删除(CRUD...

    rails-1.0.0

    开发者可以定义属性、关联(如一对一、一对多、多对多)、以及验证规则,确保数据的完整性和一致性。 3. **ActionController**:控制器层处理HTTP请求,并将数据传递给视图进行渲染。它也负责调用模型来获取或更新...

Global site tag (gtag.js) - Google Analytics