ссылки на встроенные ресурсы mongo mongoid ruby rails


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

Доступные метки задаются на уровне учетной записи...

И у меня есть электронная почта, к которой я хочу применить некоторые ярлыки..

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 объекты. Когда я подключаюсь к контроллеру, я получаю следующее сообщение об ошибке.

Ссылка на документ метки (n) из документа электронной почты через реляционную ассоциацию не допускается, так как метка встроена.

Резюме:
Чтобы правильно получить доступ к метке(n) из EmailRoute, ссылка должна пройти через корневой документ Label. В простом случае это потребовало бы от Mongoid хранить дополнительный внешний ключ для корня, в более сложных случаях там, где метка имеет глубину нескольких уровней, ключ должен храниться для каждого родителя в иерархии.

Резолюция:
Подумайте о том, чтобы не встраивать метку или делать хранение ключей и доступ к ним пользовательским способом в коде приложения.): "

Есть ли какой-нибудь способ обойти это? Я знаю, что есть много статей, касающихся embedded, но ни одна из них не подходит к этому конкретному случаю. Любая помощь очень ценится, так как я не хочу терять данные этикетки и нуждаюсь в них, чтобы быть указывается на уровне счета.

Спасибо!

Edit будет ли что-то подобное единственным решением? https://www.cookieshq.co.uk/posts/switching-relationships-with-mongoid

Правка 2 ... Мне удалось добраться до этой точки при вызове @account.email_routes[0].labels из консоли rails. Строки во вложенном массиве внутри селектора - это метки, которые я хотел добавить. Однако, когда я рендерю :JSON @account.email_route, массив labels является вернулся пустой. Как я могу использовать информацию в селекторе?

#<Mongoid::Criteria

Селектор: {"_id" = > {"$in " =>["критические обновления тестов", "Chill", "New", > "Make", "Cool", "1", "2", "3"]}} опции: {} класс: этикетка встроенный: true>

1 2

1 ответ:

Этот геттер в модели EmailRoute делает трюк

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