Model中好用的小知识
ids
在strong params内加入post_ids:[],使用simple_form时只要写上f.association就可以了,传入controller的时候会形成post_ids这个array,rails会根据post_ids帮我们建立关联
|
|
collect(&:id)
|
|
这都可以把users中的id或者name都拿出来组成一个array
比如:
|
|
执行结果 [1,2]
把id都变成浮点数
|
|
或者
|
|
产生结果:[1.0,2.0]
includes
不好的写法
|
|
然后在view中使用@board.topics,来获得每一个topic,如果有10个topics,这样系统会到数据库中查找10次。
如果用includes
|
|
在view中写@board.topics,就只会去数据库查找一次,把10个topic一次查出来,然后把抓出来的所有topic和board用board_id相关联。
这样做减少了数据库的负担。提到效能。
counter_cache
counter_cache是在做关联关系时计算数据量的一个方法。
不好的写法:
|
|
这代表我们都要算数量的时候都得通过sql去数据库计算topics,也会造成效能问题。
所以rails内建了counter_cache方法。
|
|
在Board表中增加字段topics_count.这样以后Board内的topics有增减的时候,rails就会帮我们增减topics_count,这样在写@board.topics.size后,rails就会预设去找topics_count,不用重新生成sql去数据库中查找。
如果想写成自己定义的字段名称,如count_of_topics,那么可以这样做
|
|
STI
单一表格继承 STI(Single-table inheritance)
Rails Guide 對此的說明:
a way to add inheritance to your models
让子类继承父类的属性和方法。
在父类中加入type,来表示类型
例:User有分 Native 跟 Foreigner;
使用场景:拥有一样的特性,但是行为不同时使用继承。
|
|
Polymorphic Assoiciaion
Polymorphic Assoiciaion是rails内让两个不同的Model同时has_many一个model的做法。最常见的就是做留言系统的时候。
对文章可以留言,对看板留言,但是这些留言所需要的字段都是一样的,没必要建两套。
那么,这样的model只需要新增一个Comment model再用Polymorphic Assoiciaion关联就可以了。
|
|
Comment里面必须包含两个字段。
commentable_id和commentable_type
commentable_type记录model名称
commentable_id记录该model下的id
Rails3之後的 migration 可以單獨寫t.references :imageable, polymorphic: true就會自動生成這兩個欄位。
|
|