Mongoid:如何在用户和消息n到m关系中具有不同的字段



我有两个模型,如下所示:

class User
include Mongoid::Document
   has_many_and_belongs_to :messages

结束

class Message
  include Mongoid::Document
  has_many_and_belongs_to :users
  field :text
  field :visited, type: Boolean, default: false
end

据我所知,当这个模板实现消息字段时,用户之间很常见。我在这里想要的是visited字段对每个用户来说都是不同的。知道这将如何适用吗? I have an alternative such as a middle model to save user & message id with desire field but that seems messy .

您需要自己建立has_and_belongs_to_many关系。通过这种方式,您可以自定义用于链接UserMessage的类:

class User
  include Mongoid::Document
  has_many :user_messages
end
class Message
  include Mongoid::Document
  has_many :user_messages
end
class UserMessage
  include Mongoid::Document
  belongs_to :user
  belongs_to :message
  field :visited, type: Boolean, default: false
  scope :visited,   -> { where(visited: true) }
  scope :unvisited, -> { where(visited: false) }
end

然后你可以做:

u = User.new
m = Message.new
u.user_messages.build(message: m, visited: true)
u.user_messages.build(message: m, visited: false)
u.user_messages.count
=> 2
u.user_messages.visited.count
=> 1
u.user_messages.unvisited.count
=> 1

有关此类关联的更多信息,请点击此处查看 Rails Guide。

请注意,UserMessage类名非常烦人。您可以改用不同的命名,例如 Conversation

class User
  has_many :messages
end
class Conversation
  has_many :messages
end
class Message
  belongs_to :user
  belongs_to :conversation
  field :visited, type: Boolean, default: false
end

用得好:

u = User.new
c = Conversation.new
u.messages.build(conversation: c)

最新更新