【发布时间】:2014-08-21 17:22:28
【问题描述】:
我正在尝试建立一个评级系统。我最近升级了我的迁移文件。
class AddRatingsToPictures < ActiveRecord::Migration
def change
add_column :pictures, :ratings_count, :integer
add_column :pictures, :rating_total, :integer
add_column :pictures, :rating, :integer
end
end
这是我的模型中的代码
def ratings_count
self[:ratings_count] || 0
end
def ratings_total
self[:rating_total] || 0
end
def add_rating(rating)
return if rating.nil? || rating == 0
self.ratings_count += 1
self.rating_total += rating.to_i
self.stars = (self.rating_total.to_f / self.ratings_count)
self.save
end
def rating
self[:rating] || 0
return 0 if self.ratings_count == 0
(self.rating_total.to_f / self.ratings_count).round(2)
end
这是我在 Rails 控制台中尝试过的一些事情
p = Picture.find(1)
p.rating == nil
false
p[:rating] == nil
true
我认为问题在于这个sn-p。
def rating
self[:rating] || 0
return 0 if self.ratings_count == 0
(self.rating_total.to_f / self.ratings_count).round(2)
end
如果我在一个对象上调用 .rating,它会返回正确的评级。如果我在一个对象上调用 [:rating] 它返回 nil。
我问这个的原因是因为我需要它用于 Active Record Querying,我必须调用实际属性。具体来说就是这行代码。
<% Picture.where("rating >= 4.5").order(rating: :desc, title: :asc).each do |picture| %>
我的评级方法有效,但仅作为方法调用,而不是作为属性。考虑到 :ratings_count 和 :rating_total 都有效。
p.ratings_count
=> 2
p[:ratings_count]
=> 2
p.rating_total
=> 9
p[:rating_total]
=> 9
看来我的方法可以为我的模型创建属性。原因可能在我的 add_rating 方法中。
def add_rating(rating)
return if rating.nil? || rating == 0
self.ratings_count += 1
self.rating_total += rating.to_i
self.stars = (self.rating_total.to_f / self.ratings_count)
self.save
end
上面我调用了save方法,大概记录了模型中的属性。
我想我已经很接近了,但看起来我需要帮助。任何建议表示赞赏。提前致谢。
【问题讨论】:
标签: ruby-on-rails ruby activerecord attributes null