Включить столбец из другой таблицы в запрос (rails activerecord) - PullRequest
0 голосов
/ 02 ноября 2019

В контроллере диалога у меня есть следующее:

  def users_with_existing_conversations
    authorize! :users_with_existing_conversations, Conversation

    @users = User.accessible_by(current_ability, :index_conversations)

    @users = @users.where(id: Conversation.select(:sender_id))
                    .or(@users.where(id: Conversation.select(:recipient_id)))

    @users = @users.search(params[:query]) if params[:query].present?


    @users = sort_and_paginate(@users)
    set_meta_tags title: "Existing Conversations", reverse: true
  end

Внутри пользовательской модели у меня есть это has_many отношение:

  has_many :sender_conversations, class_name: 'Conversation', foreign_key: "sender_id", dependent: :destroy
  has_many :recipient_conversations, class_name: 'Conversation', foreign_key: "recipient_id", dependent: :destroy

Внутри модели контроллера, яиметь ассоциацию belongs_to:

 belongs_to :sender, foreign_key: :sender_id, class_name: 'User'
  belongs_to :recipient, foreign_key: :recipient_id, class_name: 'User'

Возвращаясь к контроллеру, объект @users отображается в представлении. Мне нужен дополнительный столбец из таблицы разговоров, который является столбцом last_updated.

Поэтому в основном я хочу добавить пару ключ-значение в @users из таблицы conversation

Iпробовал такие вещи, как

@users.each do |user|
user[:latest_conversation] = Conversation.where(sender_id: user.id)
end

, что приводит к can't write unknown attribute latest_conversation

Я также пытался сделать тестовый запрос, например

@testUsers = @users.sender_conversations

Что приводит к undefined method sender_conversations

Как вы можете видеть выше, у меня есть ассоциации в моей модели. В документах приведены примеры, и я подумал, что это будет работать

На мой взгляд, у меня есть:

 <% @users.each do |user| %>
  <tr class="table__row" onclick="window.location.href = '/conversations?user_id=<%= user.id %>'">
    <td><%= user.name %></td>
    <td><%= user.surname %></td>
    <td><%= user.email %></td>
    <td><%= user.company_name.present? ? user.company_name : "N/A" %></td>
    <td><%= user.role.capitalize %></td>
    <td><%= user.created_at.try(:strftime, '%b %d, %Y') %></td>
    <td><%= user.latest_conversation %></td>
    <td class="table__more">
      <%= link_to "Show details", conversations_path(user_id: user.id), class: 'table__row__details button button--tertiary button--tertiary-small' %>
    </td>
  </tr>
  <% end %>

Так что мне бы очень хотелось получить доступ к @user.latest_conversation внутри цикла пользователей

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

app / models / user.rb:

class User < ApplicationRecord
  # ...

  # combines both "sender" and "recipient" conversations
  # you can also move this into a `has_many :conversations` but you'll need 
  # to `unscope`; see @dre-hh answer here https://stackoverflow.com/questions/24642005/rails-association-with-multiple-foreign-keys
  def conversations
    Conversation.where(sender_id: id).or(
      Conversation.where(recipient_id: id)
    )
  end

  ## instead of above, try the commented code below
  ## Untested, but I think this should also work
  # def conversations
  #  sender_conversations.or(recipient_conversations)
  # end

  # get the latest conversation ordered by "last_updated"
  def latest_conversation
    conversations.order(last_updated: :desc).first
  end
end
1 голос
/ 02 ноября 2019

Почему вы не определяете метод для модели User?

class User < ...

  def latest_conversation
    sender_conversations.last
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...