mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-03-24 09:43:24 -04:00
Improved program efficiency (in querying in particular) by replacing .count and .length with .size for collections. Fix error in refactoring Reverted some .size into .count
56 lines
1.7 KiB
Ruby
56 lines
1.7 KiB
Ruby
class Post < ActiveRecord::Base
|
|
extend FriendlyId
|
|
friendly_id :author_date_subject, use: [:slugged, :finders]
|
|
belongs_to :author, :class_name => 'Member'
|
|
belongs_to :forum
|
|
has_many :comments, :dependent => :destroy
|
|
has_and_belongs_to_many :crops
|
|
before_destroy {|post| post.crops.clear}
|
|
after_save :update_crops_posts_association
|
|
# also has_many notifications, but kinda meaningless to get at them
|
|
# from this direction, so we won't set up an association for now.
|
|
|
|
default_scope { order("created_at desc") }
|
|
|
|
validates :subject,
|
|
:format => {
|
|
:with => /\S/
|
|
}
|
|
|
|
def author_date_subject
|
|
# slugs are created before created_at is set
|
|
time = created_at || Time.zone.now
|
|
"#{author.login_name} #{time.strftime("%Y%m%d")} #{subject}"
|
|
end
|
|
|
|
def comment_count
|
|
self.comments.size
|
|
end
|
|
|
|
# return the timestamp of the most recent activity on this post
|
|
# i.e. the time of the most recent comment, or of the post itself if
|
|
# there are no comments.
|
|
def recent_activity
|
|
self.comments.present? ? self.comments.reorder('created_at DESC').first.created_at : self.created_at
|
|
end
|
|
|
|
# return posts sorted by recent activity
|
|
def Post.recently_active
|
|
Post.all.sort do |a,b|
|
|
b.recent_activity <=> a.recent_activity
|
|
end
|
|
end
|
|
|
|
private
|
|
def update_crops_posts_association
|
|
self.crops.destroy_all
|
|
# look for crops mentioned in the post. eg. [tomato](crop)
|
|
self.body.scan(Haml::Filters::GrowstuffMarkdown::CROP_REGEX) do |m|
|
|
# find crop case-insensitively
|
|
crop = Crop.where('lower(name) = ?', $1.downcase).first
|
|
# create association
|
|
self.crops << crop if crop and not self.crops.include?(crop)
|
|
end
|
|
end
|
|
end
|