Rails模型中的一对多关系

问题描述 投票:3回答:4

我正在学习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

ExpensePicture模型

class ExpensePicture < ActiveRecord::Base
  belongs_to :user
end

IncomePicture模型

class IncomePicture < ActiveRecord::Base
  belongs_to :user
end

我坚持如何真正建立这些关系。

我希望用户与one to manyIncomePictureExpensePicture关系

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

例如:

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
ruby-on-rails ruby one-to-many foreign-key-relationship
4个回答
3
投票

只要处理模型内的图像,就可以使用PaperclipCarrierwave(更新的宝石)。这两者都非常简单易行。

另外看一下关于Paperclip和thisthis railscast关于carrierwave,非常具有启发性。

此外,你的模特之间的关系有什么问题?它不起作用吗?因为它有道理。只需在has_many声明中使用复数,我认为就是这样。


5
投票

协会

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

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

--

一个一对多

one-to-many协会是Rails最常见的协会之一 -

它非常简单:

#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 :)

这应该是您正在寻找的,并提供相关文档来帮助您

--

TO

给你奖金: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来标识保存它的模型)

这是实现目标的最快捷方式


1
投票

您必须将声明分开,并且必须将它们声明为复数版本(带有's')

DRY

通过class User < ActiveRecord::Base ... has_many :expense_pictures has_many :income_pictures end 很有用


1
投票

guide关联表示模型A的每个实例可以具有零个或多个另一个模型B的实例,而模型B只属于一个模型A.

您的模型应该如何:

one-to-many

请注意,has_many后面总是后跟一个复数词:class User < ApplicationRecord has_many :stories end class Story < ApplicationRecord belongs_to :user end 。正确决定哪种型号具有has_many :stories以及哪种型号具有has_many也非常重要。第二个模型(Stories)包含对外键形式的第一个模型的引用。

第二个模型不知道第一个模型与它的关系,它不知道第一个模型是引用了多个模型还是只引用了一个模型。

您可以在本文中阅读有关belongs_to的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.