【问题标题】:rails associations, retrieve conversation between 2 usersrails 关联,检索 2 个用户之间的对话
【发布时间】:2016-06-11 16:54:29
【问题描述】:

我有一个使用 postgres 数据库的 rails 应用程序,我正在尝试添加一个功能,让 2 个用户可以直接互相聊天。我是用户模型和对话模型,它们通过has_and_belongs_to_many 关系相关联。我也有这个关系的联合表。

class CreateJoinTableUserConversation < ActiveRecord::Migration
  def change
    create_join_table :users, :conversations do |t|
    end
  end
end

我的目标是当一个用户点击链接与另一个用户聊天时,如果没有与这两个用户相关的对话对象,则创建一个。否则检索现有对话。如何使用活动记录或 sql 调用来执行此操作?我不想遍历所有对话并检查这两个用户是否在conversation.users 中,因为当有很多对话时,这将花费很长时间。有没有办法访问联合表以某种方式检索有 2 个特定用户与之关联的对话记录?

编辑

这是架构中的表。

  create_table "conversations", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

以下是型号:

    class Conversation < ActiveRecord::Base
      has_and_belongs_to_many :users
    end

    class User < ActiveRecord::Base
      has_and_belongs_to_many :conversations
    end

【问题讨论】:

  • 在我说出答案之前,您能否发布您的对话模型的架构?
  • 当你这样做时请提及我,我会收到通知。谢谢!
  • @JoshDeeden 好的,我已经添加了架构和模型

标签: sql ruby-on-rails ruby postgresql rails-activerecord


【解决方案1】:

您可以使用has_many: through 关系来代替has_and_belongs_to_many 关系。这将为您提供与您的案例对话模型一样的联合表模型。这样您就可以使用模型对联合表执行 where 查询。

但您还需要在连接表中添加两个用户的外键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2019-03-27
    • 2014-08-09
    相关资源
    最近更新 更多