【问题标题】:referencing embedded resources mongo mongoid ruby rails引用嵌入式资源 mongo mongoid ruby​​ rails
【发布时间】:2018-07-23 03:43:47
【问题描述】:

ruby 2.50 rails 5.1.4 gem 'mongoid' gem 'mongoid_paranoia' gem 'mongoid-tree' gem 'mongoid-autoinc' gem 'mongoid-userstamps'

我在使用嵌入式资源时遇到问题。

我有一个Account 模型。

class Account
  store_in collection: 'accounts'

  has_many :email_routes, dependent: :destroy
  embeds_many :labels, as: :labelable

  etc..
end

如您所见,每个帐户都有许多标签。

class Label
  embedded_in :labelable, polymorphic: true
  belongs_to :email_routes

  field :text, type: String
  field :color, type: String
end

可用标签在帐户级别指定...

我有一个 EmailRoute,我想给它应用一些标签..

class EmailRoute
  belongs_to :account

  field :email_address, type: String
  has_many :labels, as: :labelable, dependent: :nullify

  # field :labels, type: Array, default: []
end

email_routes_controller,我有一个简单的更新动作..

def update
  selected_labels = params[:labels]

  @email_route.update_attributes!(labels: selected_labels)

  render json: @email_route
end

params[:labels] 包含一个 Label 对象数组。当我修补控制器时,我收到以下错误/消息。

由于标签已嵌入,因此不允许通过关系关联从 EmailRoute 文档中引用 (n) 标签文档。

总结:
为了从 EmailRoute 正确访问 a(n) 标签,引用需要通过标签的根文档。在一个简单的情况下,这将需要 Mongoid 为根存储一个额外的外键,在更复杂的情况下,标签是多个级别的深度,则需要为层次结构中的每个父级存储一个键。

分辨率:
考虑不嵌入Label,或者在应用代码中以自定义的方式进行key的存储和访问。):"

有什么办法可以解决这个问题吗?我知道有很多关于嵌入式的文章,但似乎没有一个完全适合这种特殊情况。非常感谢任何帮助,因为我不想丢失标签数据并且需要在帐户级别指定它们。

谢谢!

edit 这样的事情会是唯一的解决方案吗? https://www.cookieshq.co.uk/posts/switching-relationships-with-mongoid

edit 2 ...当我从 Rails 控制台中调用 @account.email_routes[0].labels 时,我已经成功地做到了这一点。选择器内嵌套数组中的字符串是我要添加的标签。但是,当我渲染 :json @account.email_route 时,标签数组返回为空。如何使用选择器中的信息?

#<Mongoid::Criteria

选择器:{"_id"=>{"$in"=>["Critical Test updates", "Chill", "New", >"Make", "Cool", "1", "2", "3"]}} 选项: {} 类别:标签 嵌入:真>

【问题讨论】:

  • @Clifford 感谢您的编辑

标签: ruby-on-rails ruby mongodb mongoid embedded-resource


【解决方案1】:

EmailRoute 模型中的这个 getter 可以解决问题

def labels
    account.labels.where(:_id.in => self[:labels])
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2011-05-25
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多