我正在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
关系,对吗??)
总体而言,我想运行类似SELECT * FROM participants INNER JOIN users ON participants.user_id = users.id WHERE participants.room_id = 1
的SQL查询。如何编写Rails来运行此查询?
答案 0 :(得分:0)
我认为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
就可以了。
答案 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