我有两个模型,如下所示:
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
关系。通过这种方式,您可以自定义用于链接User
和Message
的类:
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)