我正在学习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 many
和IncomePicture
有ExpensePicture
关系
我也不确定如何处理模型中的图像文件
例如:
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
只要处理模型内的图像,就可以使用Paperclip或Carrierwave(更新的宝石)。这两者都非常简单易行。
另外看一下关于Paperclip和this的this railscast关于carrierwave,非常具有启发性。
此外,你的模特之间的关系有什么问题?它不起作用吗?因为它有道理。只需在has_many声明中使用复数,我认为就是这样。
协会
你所看到的是一种叫做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
STI是一项高级功能(因此我不希望您立即学习它),但它们肯定会帮助您完成当前项目。基本上,它们允许您定义从单个表继承的“父”/“子”模型(具有单个pictures
表,而不是多个income_pictures
和expense_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
来标识保存它的模型)
这是实现目标的最快捷方式
您必须将声明分开,并且必须将它们声明为复数版本(带有's')
DRY
通过class User < ActiveRecord::Base
...
has_many :expense_pictures
has_many :income_pictures
end
很有用
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
的更多信息。