From a08e724476f47b85de9bb334eeadaf882a7a23ee Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 25 Mar 2016 02:13:30 +0100 Subject: Fix subscriptions:clear task, refactor feeds, refactor streamable activites and atom feed generation to some extent, as well as the way mentions are stored --- app/models/status.rb | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) (limited to 'app/models/status.rb') diff --git a/app/models/status.rb b/app/models/status.rb index 76218bea0..59c94aaca 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -1,24 +1,23 @@ class Status < ActiveRecord::Base include Paginable + include Streamable belongs_to :account, inverse_of: :statuses belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs - has_one :stream_entry, as: :activity - has_many :favourites, inverse_of: :status, dependent: :destroy has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread - has_many :mentioned_accounts, class_name: 'Mention', dependent: :destroy + has_many :mentions, dependent: :destroy validates :account, presence: true validates :uri, uniqueness: true, unless: 'local?' validates :text, presence: true, if: Proc.new { |s| s.local? && !s.reblog? } scope :with_counters, -> { select('statuses.*, (select count(r.id) from statuses as r where r.reblog_of_id = statuses.id) as reblogs_count, (select count(f.id) from favourites as f where f.status_id = statuses.id) as favourites_count') } - scope :with_includes, -> { includes(:account, :mentioned_accounts, reblog: [:account, :mentioned_accounts], thread: [:account, :mentioned_accounts]) } + scope :with_includes, -> { includes(:account, :mentions, reblog: [:account, :mentions], thread: [:account, :mentions]) } def local? self.uri.nil? @@ -60,18 +59,6 @@ class Status < ActiveRecord::Base self.attributes['favourites_count'] || self.favourites.count end - def mentions - if @mentions.nil? - @mentions = [] - @mentions << thread.account if reply? - @mentions << reblog.account if reblog? - self.mentioned_accounts.each { |mention| @mentions << mention.account } unless reblog? - @mentions = @mentions.uniq - end - - @mentions - end - def ancestors Status.where(id: Status.find_by_sql(['WITH RECURSIVE search_tree(id, in_reply_to_id, path) AS (SELECT id, in_reply_to_id, ARRAY[id] FROM statuses WHERE id = ? UNION ALL SELECT statuses.id, statuses.in_reply_to_id, path || statuses.id FROM search_tree JOIN statuses ON statuses.id = search_tree.in_reply_to_id WHERE NOT statuses.id = ANY(path)) SELECT id FROM search_tree ORDER BY path DESC', self.id]) - [self]) end @@ -80,7 +67,11 @@ class Status < ActiveRecord::Base Status.where(id: Status.find_by_sql(['WITH RECURSIVE search_tree(id, path) AS (SELECT id, ARRAY[id] FROM statuses WHERE id = ? UNION ALL SELECT statuses.id, path || statuses.id FROM search_tree JOIN statuses ON statuses.in_reply_to_id = search_tree.id WHERE NOT statuses.id = ANY(path)) SELECT id FROM search_tree ORDER BY path', self.id]) - [self]) end - after_create do - self.account.stream_entries.create!(activity: self) + def self.as_home_timeline(account) + self.where(account: [account] + account.following).with_includes.with_counters + end + + def self.as_mentions_timeline(account) + self.where(id: Mention.where(account: account).pluck(:status_id)).with_includes.with_counters end end -- cgit