首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails Mongoid :查询嵌入文档和访问Mongoid条件

Rails Mongoid :查询嵌入文档和访问Mongoid条件
EN

Stack Overflow用户
提问于 2017-06-01 20:58:36
回答 1查看 981关注 0票数 1

我有一个应用程序,用户可以创建许多旅游,他们可以邀请他们的facebook朋友。在旅行文档中,有一个字段“参与者”,即嵌入文档,即嵌入到Participant模型中的Travel模型。

以下是我的模特:

代码语言:javascript
复制
class Travel
  include Mongoid::Document
  include Mongoid::Timestamps

  # relations
  belongs_to :user

  # fields
  field :title, type: String
  field :description, type: String
  field :begin_date, type: Date
  field :end_date, type: Date
  field :budget, type: Integer
  field :go_back, type: Boolean
  field :title_namespace, type: String

  # friends
  embeds_many :participants
  accepts_nested_attributes_for :participants

end

class Participant
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name, type: String
  field :user_id, type: String

  # relations
  embedded_in :travel, :inverse_of => :participants

end

当我试图显示邀请用户的旅行时,请提供以下请求:

代码语言:javascript
复制
@travel_participations = Travel.where('participants.user_id' => @user.id)

我没有任何结果,即使我在byebug中有这一行:

代码语言:javascript
复制
#<Mongoid::Criteria
  selector: {"participants.user_id"=>BSON::ObjectId('592c8da58511989ec850921e')}
  options:  {}
  class:    Travel
  embedded: false>

所以当我把这个放在我的观点上时:

代码语言:javascript
复制
<% unless @participations.nil? %>
  <% @travel_participations.each do |travel_participation| %>
    <p> <%= travel_participation.title %> </p>
  <% end %>
<% end %>

我试过.all.first.to_a.as_json,没有结果.有人知道问题出在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-01 21:11:33

在您的嵌入式模型中有这样的内容:

代码语言:javascript
复制
field :user_id, type: String

但是您的查询使用的是BSON::ObjectId

代码语言:javascript
复制
Travel.where('participants.user_id' => @user.id)

如原始查询中所示:

代码语言:javascript
复制
selector: {"participants.user_id"=>BSON::ObjectId('592c8da58511989ec850921e')}

嵌入的文档可能有一个字符串字段,如下所示:

代码语言:javascript
复制
"user_id": "592c8da58511989ec850921e"

而不是您要寻找的ObjectId

代码语言:javascript
复制
"user_id": ObjectId("592c8da58511989ec850921e")

所以,由于类型错配,你找不到你要找的东西。

要么修复嵌入字段的类型:

代码语言:javascript
复制
field :user_id, type: BSON::ObjectId

或者以字符串的形式查询它:

代码语言:javascript
复制
Travel.where('participants.user_id' => @user.id.to_s)

更改类型将涉及修复您已经拥有的任何数据,以不同的方式更改查询是丑陋的。

有时Mongoid会为您转换字符串和ObjectIds,有时不会。当我使用Mongoid时,我将to_bson_id方法修补为BSON::ObjectIdStringMongoid::Document、.这样我就可以说:

代码语言:javascript
复制
Model.where(:some_id => some_id.to_bson_id)

而不必总是担心some_id是什么类型。我还确保所有ID字段都指定为BSON::ObjectId

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44316985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档