ограничивающие поля, возвращаемые из mongoid полиморфного отношения - PullRequest
0 голосов
/ 20 марта 2012

У меня есть полиморфное отношение в монгоиде, подобное следующему:

class Company
  include Mongoid::Document
  field :name, :type => String
  has_many :posts, as: :postable
end

class Person
  include Mongoid::Document
  field :name, :type => String
  has_many :posts, as: :postable
end

class Post
  include Mongoid::Document
  belongs_to :postable, polymorphic: true
end

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

Person.only(:name).find(some_post.postable_id)

Но возможно ли это в полиморфном отношении?

1 Ответ

0 голосов
/ 30 марта 2012

Я вижу несколько способов сделать это, но я не уверен, какой из них лучший. Сложные отношения не являются сильной стороной MongoDB, и другие NoSQL и запросы могут стать дорогостоящими, если вы начнете сканировать несколько документов для ваших ответов.

Использование где:

Person.where(name: "name").posts.where(postable_id: "id")

Поиск родителя по должности:

Post.where(id: "id").person.only(:name)

(обратите внимание, что postable_id и id не совпадают!)

Однако будьте осторожны. Если все, что вы делаете, - это публикуете сообщения, вам, вероятно, лучше включить имя человека в сообщение и написать обратный вызов, чтобы обновить имя человека, если он изменит свое имя. В качестве альтернативы, если вы ссылаетесь на комментарии человека, почему бы не включить идентификаторы комментариев (или достаточное количество данных для создания ссылки) в модель Person, чтобы можно было получить все комментарии одним вызовом документа. Точно так же, если вы получаете счетчик, используйте обратный вызов, чтобы сделать счетчик сообщений в модели Person, чтобы вы не отображали сотни сообщений каждый раз.

Надеюсь, это поможет, если не предоставит мне дополнительную информацию, и я обновлю ее.

...