Ruby on rails Mongoid中具有“属于”关联的嵌入文档
我有贝娄这样的模特。我想按来宾列表查询不同状态用户的事件。如果我没有错,活动中是否应嵌入客人名单?如果我的模型设计是错误的,我愿意接受不同的解决方案Ruby on rails Mongoid中具有“属于”关联的嵌入文档,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,我有贝娄这样的模特。我想按来宾列表查询不同状态用户的事件。如果我没有错,活动中是否应嵌入客人名单?如果我的模型设计是错误的,我愿意接受不同的解决方案 class User include Mongoid::Document end class Events include Mongoid::Document embeds_many :guests end Class Guests include Mongoid::Document embed_in :event
class User
include Mongoid::Document
end
class Events
include Mongoid::Document
embeds_many :guests
end
Class Guests
include Mongoid::Document
embed_in :event
belongs_to :user
field :status
end
我相信模型结构会起作用 下面是一个示例查询,用于获取具有“等待”状态的来宾的所有事件:
Events.where('guests.status' => 'waiting')
event = Events.first # get the desired event
event.guests.where(:status => 'waiting')
下面是另一个示例,在给定活动的情况下,让该活动的所有来宾都处于“等待”状态:
Events.where('guests.status' => 'waiting')
event = Events.first # get the desired event
event.guests.where(:status => 'waiting')
最后,您应该将模型命名为单数名称(用户、事件、来宾)。此外,您的来宾模型有一些拼写错误,我在下面修复:
class User
include Mongoid::Document
end
class Event
include Mongoid::Document
embeds_many :guests
end
class Guest
include Mongoid::Document
embedded_in :event
belongs_to :user
field :status
end
我相信模型结构会起作用 下面是一个示例查询,用于获取具有“等待”状态的来宾的所有事件:
Events.where('guests.status' => 'waiting')
event = Events.first # get the desired event
event.guests.where(:status => 'waiting')
下面是另一个示例,在给定活动的情况下,让该活动的所有来宾都处于“等待”状态:
Events.where('guests.status' => 'waiting')
event = Events.first # get the desired event
event.guests.where(:status => 'waiting')
最后,您应该将模型命名为单数名称(用户、事件、来宾)。此外,您的来宾模型有一些拼写错误,我在下面修复:
class User
include Mongoid::Document
end
class Event
include Mongoid::Document
embeds_many :guests
end
class Guest
include Mongoid::Document
embedded_in :event
belongs_to :user
field :status
end
模型结构错误,因为在
Mongo
中,您只将信息保留在嵌入文档中,而这些文档仅在父文档中需要
如果在来宾中您只有状态字段,则可以尝试此操作,例如,两种状态类型存在或不存在
class User
include Mongoid::Document
has_and_belongs_to_belongs_to :event, :inverse_of => "present_guests"
has_and_belongs_to_belongs_to :event, :inverse_of => "not_present_guests"
end
class Event
include Mongoid::Document
has_and_belongs_to_many :present_guests, :class_name => "User", :inverse_of => "present_guests"
has_and_belongs_to_has_many :not_present_guests, :class_name => "User", :inverse_of => "not_present_guests"
end
然后您可以使用如下状态进行查询
Event.first.present_guests
模型结构错误,因为在
Mongo
中,您只将信息保留在嵌入文档中,而这些文档仅在父文档中需要
如果在来宾中您只有状态字段,则可以尝试此操作,例如,两种状态类型存在或不存在
class User
include Mongoid::Document
has_and_belongs_to_belongs_to :event, :inverse_of => "present_guests"
has_and_belongs_to_belongs_to :event, :inverse_of => "not_present_guests"
end
class Event
include Mongoid::Document
has_and_belongs_to_many :present_guests, :class_name => "User", :inverse_of => "present_guests"
has_and_belongs_to_has_many :not_present_guests, :class_name => "User", :inverse_of => "not_present_guests"
end
然后您可以使用如下状态进行查询
Event.first.present_guests
那么你应该听从@abhas的建议。使用上面的模型结构,最接近的是
my\u events=Event.where('guests.user\u id'=>my\u user\u id)
,它将获得您的用户作为来宾的每个事件。然后,您必须迭代该结果列表,并找到具有所需状态的结果列表:my_events.select{e|e.guests.where(:user_id=>my_user_id,:status=>'waiting')。first}
。这远远不是最优的,所以您应该使用不同的模型方案。感谢您的帮助和解释。致以最良好的祝愿。那么你应该听从@abhas的建议。使用上面的模型结构,最接近的是my\u events=Event.where('guests.user\u id'=>my\u user\u id)
,它将获得您的用户作为来宾的每个事件。然后,您必须迭代该结果列表,并找到具有所需状态的结果列表:my_events.select{e|e.guests.where(:user_id=>my_user_id,:status=>'waiting')。first}
。这远远不是最优的,所以您应该使用不同的模型方案。感谢您的帮助和解释。顺致敬意,