-1

我有一个Star 模型模型,并包含Posttotal_stars模型的average_stars列:

  create_table "posts", force: true do |t|
    t.string   "title"
    t.text     "content"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
    t.integer  "average_stars", default: 0, null: false
    t.integer  "total_stars",   default: 0, null: false
  end

def calculate_total_stars if [Post].include?(starable.class) self.starable.update_column(:total_stars, starable.total_stars + self.number) end end

def calculate_average_stars if [Post].include?(starable.class) self.starable.update_column(:average_stars, starable.total_stars / starable.stars.count) end end

所以现在的问题是,如果average_stars最终3.6结果只是3. 我不太确定哪种计算或近似值适合五星级评级系统。但我希望它采用以下方式:1、1.5、2、2.5...

关于如何修改average_stars列以实现该结果的任何建议?

4

2 回答 2

2

与其将平均列声明为整数,不如将其声明为浮点数(或小数):

t.float  "average_stars", default: 0, null: false

然后,当您进行计算时,请执行以下操作:

def calculate_average_stars
  if [Post].include?(starable.class)
    self.starable.update_column(:average_stars, starable.total_stars.to_f / starable.stars.count)
  end
end

这会给你一个十进制值而不是一个四舍五入/截断的整数。这.to_f是那里的重要部分。

如果您希望它被四舍五入或只有固定数量的小数点,请在迁移中使用 Decimal 列(需要:limit)或做一些数学事情:

((starable.total_stars.to_f / starable.stars.count) * 100).round / 100.0
于 2013-07-26T06:07:14.513 回答
1
def calculate_average_stars
  if starable.is_a?(Post) 
    exact_average = starable.total_stars.to_f / starable.stars.count
    rounded_average = exact_average - (exact_average % 0.5)
    starable.update_column(:average_stars, rounded_average) 
  end
end
于 2013-07-26T06:07:45.440 回答