引用嵌入式资源mongo mongoid ruby​​ rails

时间:2018-02-12 21:05:20

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

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正确访问(n)标签,引用需要通过Label的根文档。在一个简单的例子中,这将需要Mongoid为根存储额外的外键,在更复杂的情况下,Label是多级深度,需要为层次结构中的每个父级存储一个密钥。

     

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

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

谢谢!

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

编辑2 ...在rails控制台中调用@account.email_routes[0].labels时,我设法达到了这一点。选择器中嵌套数组中的字符串是我要添加的标签。但是,当我渲染:json @ account.email_route时,labels数组返回为空。如何使用选择器中的信息?

#<Mongoid::Criteria
     

选择器:{&#34; _id&#34; =&gt; {&#34; $ in&#34; =&gt; [&#34;关键测试更新&#34;,&#34; Chill&#34; ,&#34;新&#34;,&gt;&#34;制作&#34;,&#34;酷&#34;,&#34; 1&#34;,&#34; 2&#34;,&# 34; 3&#34;]}}    选项:{}        class:标签        embedded:true&gt;

1 个答案:

答案 0 :(得分:0)

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

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