Ruby on Rails - доступ к вложенным атрибутам текущего пользователя - PullRequest
0 голосов
/ 18 сентября 2018

я пытаюсь получить доступ к некоторым вложенным атрибутам в частичке рельсов;позвольте мне объяснить мою проблему:

я написал простую службу обмена сообщениями в соответствии с руководством Даны Малдер, о котором я упоминал в другом моем вопросе.user has_many conversations и conversation has_many messages.у каждого разговора есть получатель и отправитель, а каждое сообщение имеет логическое значение read, которое по умолчанию установлено на false.

я пытаюсь написать простую функцию, которая перебирает каждое сообщение, полученное пользователем в разговоре, в котором он участвует, проверяет, прочитано ли последнее сообщение, полученное пользователем в беседе, == trueи не отправить самому, чтобы отобразить небольшую ручку рядом со ссылкой «сообщения» в навигации моего приложения.

То, что я в основном хочу проверить (несколько строк для лучшей читаемости):

<%= if current_user.conversations.all.messages.last.user_id != current_user.id && current_user.conversations.all.messages.last.read == false %>

    Message link with bubble beside it

<% else %>

    Message link

<% end %>

Этот синтаксис не работает. Как можно перебирать каждый диалог, в который вовлечен пользователь, проверить последнее сообщение каждого разговора, если оно написано этим пользователем, и если нет, если оно уже прочитано?

пока работает что-то вроде Conversation.last.messages.last.content, current_user.conversations.all.messages.last.content не работает .. я немного сбиваю с толку, как работает доступность моделей рельсов.

заранее спасибо!Я надеюсь, что объяснил мне достаточно хорошо.

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 18 сентября 2018

Что вы пытаетесь сделать с current_user.conversations.all.messages.last.content?поскольку conversations.all является ассоциацией, это НЕ разговор, поэтому messages не является доступным методом.Conversation.last - это разговор, поэтому вы можете позвонить на messages.

Вы можете попробовать current_user.conversations.last.messages.last.content, чтобы получить последнее сообщение последнего разговора, или вы можете использовать "has_many: through"отношение к пользователю

class User ...
  has_many :conversations
  has_many :messages, through: :conversations
end

Таким образом, вы можете сделать current_user.messages, если вы хотите, чтобы ВСЕ сообщения пользователя и current_user.messages.last получили последнее сообщение (даже если оно не из последнего разговора).

Я бы рекомендовал вам прочитать Руководство Rails об ассоциациях https://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

РЕДАКТИРОВАТЬ: Чтобы узнать, есть ли у пользователя непрочитанные сообщения, вы можете использовать ассоциацию has_many :through и сделать что-то вроде

current_user.messages.where(read: false).where.not(user_id: current_user.id).any?

Это вернет true любое сообщение из разговоров пользователя с id! = Current_user.id не читается.И false в противном случае.

Вы можете использовать count вместо any?, если вы не хотите знать фактическое количество непрочитанных сообщений.

...