17

所以基本上我想知道是否有一些通用的方法来定义自己的关联类型。一些细节:

我有一个模型conversations,它有一个 PG 数组列user_ids。因此,要检索用户对话,我需要运行: select conversations.* from conversations where USER_ID = ANY(conversations.user_ids)

由于finder_sql现在不推荐使用它的朋友,我真的很想知道实现这个伪 has_many 关联的最佳方法是什么?

目前我只使用以下方法:

 def conversations
   Conversation.where("#{id} = ANY (conversations.users)")
 end

所以基本上我正在考虑实施我自己的ActiveRecord::Associations::CollectionAssociation,并想知道是否有一些好的参考资料,或者你是否可以建议从哪里开始


4

3 回答 3

2

我建议对您的模型进行规范化,以拥有另一个表来保持用户和对话之间的关系,例如,构建一个像

用户对话

你的关系将是

class User < ApplicationRecord
  has_many :users_conversations, :dependent => :destroy
  has_many :conversations, :through => :users_conversations
end

class Conversation < ApplicationRecord
  has_many :users_conversations, :dependent => :destroy
  has_many :users, :through => :users_conversations
end     

然后你可以轻松做到

#users for each specific conversation
@users = Conversation.find(1).users
#conversations for each specific user
@conversations = User.find(1).conversations

除非您想保持相同的方式或数组,否则您可以这样做

@users = User.where(:id => Conversation.find(1).user_ids)

如果 user_ids 存储为像 [1,10,20] 这样的数组,那么它将正常工作并返回用户

于 2019-07-22T19:35:22.567 回答
1

您应该将其重新构建为包含会话 ID 和用户 ID 的参考表,然后您可以使用 Rails 的最佳实践(https://guides.rubyonrails.org/association_basics.html#the-has-many-through -协会

如果您仍想保留此结构,我建议:

User.where(id: conversion.user_ids)(conversion 是 Conversation 表的一个实例)

于 2019-06-24T01:44:27.113 回答
0

怎么样:

Conversation.user.select{ |conversation| conversation.user_ids.include?(params[:id])

考虑到 user_ids 列是序列化的,当前用户 id 是通过 params[:id] 传递的

主要方法是,如果你有一个数组,你可以用 .include?(something) 方法检查它是否有“东西”。以这种方式思考,您可以使用 select 方法通过 include 方法实际选择在此数组中具有其 ID 的对象(在本例中为用户)。我说清楚了吗?

告诉我它是否有效...

于 2014-04-29T17:31:39.410 回答