Rails - 为每条记录分配一个订单号

时间:2015-04-10 21:22:48

标签: ruby-on-rails arrays

所以我将书中的段落导入我的应用程序。我给出了一本书中所有段落的段落。即Passage.all

我有很多书,所以我也有一本班级书。因此,当我从一本书中找到所有段落时,我称之为:

Passage.where(book_id: self.book_id)

当我使用where方法时,它是否保留了“自然顺序”,Passage.all通常会返回。如果没有,我可以将代码更改为:

Passage.where(book_id: self.book_id).order("created_at ASC")

无论如何,我接着写下这段代码:

a = Passage.where(book_id: self.book_id)     
b = a.index(self)+1     
self.passage_number = b

[第一行:返回书中的所有段落]

[第二行:在数组中返回它们的数字+ 1来代表0起始值的东西(原谅白话)]

[第三行:将索引值分配给段号]

最终,我试图计算段落数,而不必硬编码。

那我的问题是什么?现在我得到三段#3,两段#4。我的最后一段是:

Passage.last.passage_number = 217 
Passage.where(book_id: 5).count = 241 

它正在跳过数字并错误地编制索引,因此我认为我需要编写更好的方法!在这种情况下索引数组的更好方法是什么?

1 个答案:

答案 0 :(得分:2)

没有“自然顺序”这样的东西:没有订单条款Passage.all可以按照数据库想要的任何顺序返回内容(这可能取决于磁盘上项目的位置,查询计划等)。

firstlast方法的特殊之处在于,如果您的关系尚未对其应用订单,则按ID排序。

如果您需要特定订单中的内容,请添加订单子句。