Как написать код в Rails для запуска желаемого запроса в SQL - PullRequest
0 голосов
/ 20 января 2019

Я создаю приложение для чата в Rails и у меня есть 3 таблицы следующим образом:

  • Пользователи id, name
  • Номера id, user_id, title
  • Участники id, room_id, user_id

users и rooms имеют следующие ассоциации.

# user.rb
has_many :rooms
# room.rb
belongs_to :user

Я хочу показать список имен участников, написав:

# rooms/show.html.erb
<% @participants.each do |participant| %>
  <%= participant.user.name %>
<% end %>

В моем контроллере я попытался:

# rooms_controller.rb
def show
  @participants = Participant.includes(:users).where(room_id: 1)
end

Но я получаю сообщение об ошибке Association named 'users' was not found on Participant; perhaps you misspelled it?.
У меня есть ощущение, что установление ассоциаций между users и participants могло бы решить проблему, но я не уверен, каковы их отношения. (Это не простое отношение has_many / belongs_to, правда ...?)

В целом, я хочу запустить SQL-запрос, похожий на SELECT * FROM participants INNER JOIN users ON participants.user_id = users.id WHERE participants.room_id = 1. Как я могу написать в Rails для выполнения этого запроса?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Ваша модель participant имеет название ассоциации users.

Вы можете настроить has many through ассоциацию следующим образом:

# room.rb
belongs_to :user
has_many :participants
has_many :users, through: :participants

так что в вашем контроллере вы можете получить пользователей комнаты:

room = Room.find(1)
users = room.users
0 голосов
/ 20 января 2019

Я думаю, что соотношение между User и Room является отношением «многие ко многим». Затем используйте :has_and_belongs_to_many:

https://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

Но если вы хотите установить соотношение между User и Participant как многие-ко-многим, используйте параметр :through:

https://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

Я думаю, таблица Participant не требуется, просто временная переменная participants, кажется, в порядке.

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