如何在Rails中编写代码以在SQL中运行所需的查询

时间:2019-01-20 03:10:06

标签: mysql sql ruby-on-rails ruby-on-rails-5

我正在Rails中创建一个聊天室应用,我有3张桌子,如下所示:

  • 用户idname
  • 房间iduser_idtitle
  • 参与者idroom_iduser_id

usersrooms具有以下关联。

# 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?
我感觉在usersparticipants之间设置关联可能会解决问题,但是我不确定它们之间的关系。 (这不是简单的has_many / belongs_to关系,对吗??)

总体而言,我想运行类似SELECT * FROM participants INNER JOIN users ON participants.user_id = users.id WHERE participants.room_id = 1的SQL查询。如何编写Rails来运行此查询?

2 个答案:

答案 0 :(得分:0)

我认为UserRoom之间的关系是多对多的。然后,使用:has_and_belongs_to_many

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

但是,如果要将UserParticipant之间的关系设置为多对多,请使用选项:through

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

我认为,不需要表Participant,只需要一个临时变量participants就可以了。

答案 1 :(得分:0)

您的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