Я пытаюсь отслеживать текущие, предыдущие и выбранные (изменения в конце периода) пользовательские состояния пользователя.Mongoid встраивает один класс в несколько полей
В конце месячного периода, если chosen_subscription != current_subscription
, изменяется current_subscription
.
class User
include Mongoid::Document
embeds_one :previous_subscription, class_name: "Subscription"
embeds_one :current_subscription, class_name: "Subscription"
embeds_one :chosen_subscription, class_name: "Subscription"
end
class Subscription
include Mongoid::Document
embedded_in :user
field :plan, type: String
field :credits, type: Integer
field :price_per_credit, type: BigDecimal
field :start, type: Date
field :end, type: Date
end
Mongoid хочет, чтобы указать это больше и таким образом, что не имеет смысла для меня:
Mongoid::Errors::AmbiguousRelationship:
Problem:
Ambiguous relations :previous_subscription, :current_subscription, :chosen_subscription defined on User.
Summary:
When Mongoid attempts to set an inverse document of a relation in memory, it needs to know which relation it belongs to. When setting :user, Mongoid looked on the class Subscription for a matching relation, but multiples were found that could potentially match: :previous_subscription, :current_subscription, :chosen_subscription.
Resolution:
On the :user relation on Subscription you must add an :inverse_of option to specify the exact relationship on User that is the opposite of :user.
Это происходит, когда я перезаписать существующий current_subscription. Полагаю, в данный момент Mongoid хочет отменить регистрацию подписки пользователя старой подписки.
Конечно, каждый подписной объект принадлежит только одному пользователю и user == user.previous_subscription.user == user.current_subscription.user == user.chosen_subscription.user
Но это не имеет смысла для меня, чтобы сказать, что Subscription
user
является обратным по любому из трех.
Как его правильно построить?
Я не совсем уверен, как бы вы ее построите но вы можете попробовать просить группу моногидов google. Проблема mongoid говорит вам о том, что если вы делаете 'subscription.user = some_user', он не знает, к какой подписке вы говорите, с точки зрения пользователя. Вы также можете попробовать установить 'inverse_of: nil', если вы не собираетесь использовать' subscription.user = 'в своем коде. – rubish
Я никогда не устанавливал подписку. Я думаю, что он был установлен неявно, когда я устанавливаю пользователя. * _ Подписка. inverse_of: ноль хорошо работал для меня. Если вы создадите для этого ответ, я буду отмечать его правильно. – Jan
Я добавил комментарий в ответ с немного дополнительной информацией и некоторыми ошибками с предложением. Я не считаю, что это идеальное решение, но работает для меня в большинстве случаев. – rubish