【问题标题】:How to write code in Rails to run my desired query in SQL如何在 Rails 中编写代码以在 SQL 中运行我想要的查询
【发布时间】:2019-01-20 03:10:06
【问题描述】:

我正在 Rails 中制作聊天室应用程序,我有 3 个表格,如下所示:

  • 用户id, name
  • 房间id, user_id, title
  • 参会者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 中编写来运行这个查询?

【问题讨论】:

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


    【解决方案1】:

    我认为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 似乎可以。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-04
        • 1970-01-01
        • 1970-01-01
        • 2014-12-23
        • 2021-11-04
        相关资源
        最近更新 更多