Пользовательские ключи для Mongoid ассоциации - PullRequest
6 голосов
/ 13 января 2012

Мне нужно связать две модели с простым has_many.Проблема в том, что я не хочу использовать идентификатор (_id) в качестве первичного ключа для ассоциации.Я все еще хочу, чтобы модель продолжала использовать ObjectIds по умолчанию для всего остального.

(Это работает на Rails3.1 + Mongoid)

Так что в основном я хочу:

class Message
  ...
  field :message_id, :default => proc { "fail-#{Time.now.to_f.to_s}" }
  ...
  has_many :message_reports, primary_key: :message_id, foreign_key: :message_id
  ...
end
class MessageReport
  ...
  field :message_id, :default => proc { "fail-#{Time.now.to_f.to_s}" }
  ...
  has_many :message, primary_key: :message_id, foreign_key: :message_id
  ...
end

Это будет работать только для ActiveRecord.Mongoid не поддерживает параметр primary_key.

Так как же получить те же результаты для коллекций Mongoid?

Прежде чем вы скажете: не делайте этого ...

Причина, по которой мне действительно нужно указывать это поле, а не правильный идентификатор, заключается в том, что это сообщения ... а message_ids - это уникальные идентификаторы, возвращаемые API, который я вызываю для отправки сообщения.Позже тот же идентификатор получен в обратных вызовах с другой стороны.

Я мог бы просто делать запросы и вставлять его в метод, чтобы найти «связанные» отчеты из сообщения и наоборот ... Я бы предпочелесли бы они были фактическими ассоциациями, если это возможно.

Я мог бы заставить процесс получения отчетов искать и сопоставлять объекты для ассоциации ... но я бы не стал возлагать эту ответственность там, когда она естьотчасти излишне, и это не имеет ничего общего с этими данными, кроме проверки и сохранения.

Короче: я бы предпочел ассоциацию:)

1 Ответ

1 голос
/ 05 марта 2012

Эта функция не существует в Mongoid на самом деле даже в Master, и она не планируется в Mongoid 3.0

Выполните запрос некоторых функций.Сообщество Mongoid действительно открыто, чтобы добавить новую функцию, если это хорошая идея.Для меня это хорошая идея.

...