目标
上图解释了topic与它的votes之间的关联。在本章节,我们将会把这二个Model之间的关联实作出来
步骤
步骤1:设定Model Topic里与Vote的关联
编辑app/models/topic.rb让它看起来像下面代码:
class Topic < ApplicationRecord
has_many :votes, dependent: :destroy
end
步骤2:设定Model Vote里与Topic的关联
编辑app/models/vote.rb让它看起来像下面代码:
class Vote < ApplicationRecord
belongs_to :topic
end
步骤3:在Rails console把玩一下Topics与Votes
首先,确认你已经建了至少一笔的topic数据
然后在终端机(位于Rails项目文件夹位置下)输入:
rails c
在Rails Console模式下,尝试下面这些操作
秀出总共有多少Topic篇数:
Topic.count
用变数来定义第一篇Topic
my_topic = Topic.first
可以把my_topic用其他任何名称代替,不过我们会用这名称来让下面操作更显得易懂
修改 title 的內容:
my_topic.update_attributes(title: 'Edited in the console')
增加一张投票数:
my_topic.votes.create
秀出总共有多少投票数
my_topic.votes.count
移除一个投票数
my_topic.votes.first.destroy
下面的附表列出你可以使用的Model classes方法(像是Topic and Vote),以及跟前者有些不同的Model instances方法(像是刚刚操作的my_topic等指令)。my_topic.votes这个指令是属于association分类,其方法跟Model classes雷同
解说
has_many与belongs_to:
- 在Rails里,二个Model设定之间的关系称之为『Associations』(关联)
- Associations(通常)都是成对的,意思是有has,就有belongs
- Topic会有很多的votes,所以我们在topic model里面放入has_many:votes
-
- 当你跟topic instance呼叫它所拥有的votes,会得到所有该topic的votes(用array包起来的)
- 某一个vote是属于特定topic的一部份,所以我们在vote model放入belongs_to:topic
-
- 当你跟vote instance呼叫它所属于的topic,就会得到该topic instance的数据
has_many:votes后面接出来的dependent::destroy很重要!代表该topic instance被删除时,它所拥有的votes也会一并删掉。如果没有dependent::destroy这个设定,那些votes的数据将永远存在数据库里面,变成孤儿数据(因为找不到它所属于的topic)