gpt4 book ai didi

ruby-on-rails - Rails 模型中的一对多关系

转载 作者:数据小太阳 更新时间:2023-10-29 07:44:01 27 4
gpt4 key购买 nike

我正在学习 Ruby on Rails,我正在通过制作一个小网站来练习。我正在尝试为几个模型建立一对多关系,但我遇到了一些麻烦。

目前我卡住了。我有一个 Users、ExpensePictures、IncomePictures 模型。

用户模型

class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:rememberable, :validatable

has_many :expense_picture, :income_picture
end

费用图片模型

class ExpensePicture < ActiveRecord::Base
belongs_to :user
end

IncomePicture模型

class IncomePicture < ActiveRecord::Base
belongs_to :user
end

我一直在思考如何真正建立这些关系。

我希望用户与 IncomePictureExpensePicture 具有一对多关系

我也不确定如何处理模型中的图像文件

例如:

User
- user_id (primary key)
- user_name

ExpensePicture
- picture_id (primary key)
- user_id (foreign key)
- ExpensePictureFile

IncomePicture
- picture_id (primary key)
- user_id (foreign key)
- IncomePictureFile

最佳答案

协会

你看到的是一个叫做 ActiveRecord Associations 的东西- 后端关系数据库(ORM - object-relational mapping)系统

ActiveRecord 是将 Ruby 类(模型)绑定(bind)在一起的“粘合剂”,允许您从系统上的各种不同数据库中提取数据。 Rails 内部的任何关联都由 ActiveRecord 系统管理 - 这意味着如果您可以正确设置它,您将能够获得您想要的关联

--

一对多

一对多关联是 Rails 中最常见的关联之一 -

enter image description here

它的工作原理非常简单:

#app/models/user.rb
Class User < ActiveRecord::Base
has_many :expense_pictures
has_many :income_pictures
end

#app/models/expense_picture.rb
Class ExpensePicture < ActiveRecord::Base
belongs_to :user
end

#app/models/income_picture.rb
Class IncomePicture < ActiveRecord::Base
belongs_to :user
end

这将允许您调用:

@user = User.find params[:id]
@user.income_pictures #-> collection of income pictures :)

这应该是你要找的,有相关文档可以帮助你

--

性传播感染

给你的奖金:Single Table Inheritance

STI 是一项高级功能(因此我不希望您立即学会),但它们肯定会帮助您完成当前的项目。基本上,它们允许您定义继承自 单个 表的“父”/“子”模型(具有单个 pictures 表,而不是多个 income_picturesexpense_pictures 表):

#app/models/picture.rb
Class Picture < ActiveRecord::Base
belongs_to :user
end

#app/models/user.rb
Class User < ActiveRecord::Base
has_many :expense_pictures
has_many :income_pictures
end

#app/models/expense_picture.rb
Class ExpensePicture < Picture
end

#app/models/income_picture.rb
Class IncomePicture < Picture
end

为什么这很重要?简单地说,它允许您只为这两个模型使用一个表(pictures 表将有一列 type 来标识保存它的模型)

这是远DRY实现你的目标的方式

关于ruby-on-rails - Rails 模型中的一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24847456/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com