aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/discussion.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/discussion.rb')
-rw-r--r--app/models/discussion.rb49
1 files changed, 22 insertions, 27 deletions
diff --git a/app/models/discussion.rb b/app/models/discussion.rb
index aa4ce3e..675547d 100644
--- a/app/models/discussion.rb
+++ b/app/models/discussion.rb
@@ -1,19 +1,19 @@
-
class Discussion < ActiveRecord::Base
attr_accessor :recipient_tokens, :recipient_ids
attr_reader :recipient_ids
# paginates_per 10
- # создатель
+ # creater
has_many :messages, :dependent => :destroy
- # участники
+ belongs_to :discussable, :polymorphic => true
+
+ # participants of discussion (speakers)
has_many :speakers, :dependent => :destroy
has_many :users, :through => :speakers
- # отметки о прочтении юзеров
-
+ # marks about read/unread
scope :unread_for, (lambda do |user_or_user_id|
user = user_or_user_id.is_a?(User) ? user_or_user_id.id : user_or_user_id
joins(:speakers).where("discussions.updated_at >= speakers.updated_at AND speakers.user_id = ?", user)
@@ -21,12 +21,10 @@ class Discussion < ActiveRecord::Base
accepts_nested_attributes_for :messages
- validate :check_that_has_at_least_two_users # не даем создать дискуссию, у которой нет получателей
+ validate :check_that_has_at_least_two_users # don't allow to create discussion, if there is no creator
- # добавляем записи об указанных собеседников
+ # mark as read
after_save(:on => :create) do
- # Rails.logger.info("Repicients ids: #{recipient_ids.inspect}")
-
if recipient_ids.kind_of?(Array)
recipient_ids.uniq!
recipient_ids.each do |id|
@@ -55,38 +53,30 @@ class Discussion < ActiveRecord::Base
end
def user_invited_at(user)
- speaker = find_speaker_by_user(user)
- speaker.created_at
+ find_speaker_by_user(user).created_at
end
def can_participate?(user)
- speaker = find_speaker_by_user(user)
- speaker ? true : false
+ !!find_speaker_by_user(user)
end
- # проверяет, есть ли уже беседа между пользователями
- # TODO вынести в отдельный метод а в этом возращать true/false, а то неправославно как-то
+ # don't allow to create discussion with user, if discussion with this user already exists
+ # TODO move to separated method and return boolean value
def self.find_between_users(user, user2)
dialog = nil
discussions = self.joins(:speakers).includes(:users).where("speakers.user_id = ?", user.id)
Rails.logger.info "Searching for ids: #{user.id}, #{user2.id}"
discussions.each do |discussion|
- dialog = discussion if discussion.private? && ((discussion.users.first == user && discussion.users.last == user2) || (discussion.users.first == user2 && discussion.users.last == user))
+ dialog = discussion if discussion.private? && ([discussion.users.first, discussion.users.last] - [user, user2]).empty?
end
dialog
end
- # приватная/групповая
+ # private/group discussion
def private?
self.users.size <= 2
end
- # дата последнего сообщения в дискуссии
- # def last_message_at
- # self.messages.last ? self.messages.last.created_at : nil
- # end
-
- # проверка, является ли дискуссия непрочитанной для пользователя
def unread_for?(user)
speaker = find_speaker_by_user(user)
if speaker
@@ -96,21 +86,26 @@ class Discussion < ActiveRecord::Base
end
end
- # пометить как прочитанная
+ # return amount of unreaded messages for current discussion
+ def unread_messages_count_for(user)
+ speaker = find_speaker_by_user(user)
+ messages.where("updated_at > ?", speaker.updated_at ).where("user_id != ?", speaker.id ).count
+ end
+
def mark_as_read_for(user)
speaker = Speaker.find_or_create_by_user_id_and_discussion_id(user.id, self.id)
# flag.update_attributes(:updat => Time.zone.now)
speaker.touch
end
-
+
def find_speaker_by_user user
Speaker.find_by_discussion_id_and_user_id(self.id, user.id)
end
-
+
private
def check_that_has_at_least_two_users
errors.add :recipient_tokens, t("inboxes.discussions.choose_at_least_one_recipient") if !self.recipient_ids || self.recipient_ids.size < 2
end
-end \ No newline at end of file
+end