Как настроить ассоциации MongoMapper со сложными условиями?

Я пытаюсь собрать ассоциацию, которая использует преимущества индексации подраздела документа Mongo. Например, у меня есть две коллекции, посты и темы. Посты имеют ключ тегов, который представляет собой проиндексированный набор тегов для поста — довольно ванильный. Что я хочу сделать, так это иметь что-то в моей модели темы, например:

class Topic
  key :name, String
  many :posts, :query_conditions => {:tag => lambda {|i| i.name} }
end

Идея состоит в том, что у меня есть тема с именем "mongomapper", когда я вызываю @topic.posts, я хочу, чтобы ассоциация выполняла эквивалент:

post.find({tag: "mongomapper"})

Мне действительно нужно что-то вроде опции finder_sql AR (с возможностью интерполяции значений для каждого экземпляра в запрос), которую я еще не смог найти в параметрах ассоциации MM. Существует ли что-нибудь подобное?


person Chris Heald    schedule 12.08.2010    source источник


Ответы (1)


Покопавшись во внутренностях ММ, я решил, что этого просто не произойдет. В частности, ассоциации has_many всегда ограничиваются добавлением :foreign_key => proxy_owner._id к запросу; невозможно избежать добавления этих критериев, а это означает, что вы не можете настроить ассоциации с пользовательскими поисковыми системами.

Я только что использовал именованную область в своей модели Post и вспомогательный метод в модели Topic.

class Post
  scope :tagged, lambda {|tag| where(:tags => tag)}
end

class Topic
  def posts
    Post.tagged(name.downcase)
  end
end

Это возвращает прокси-сервер запроса, поэтому для всех целей и задач я могу рассматривать его как ассоциацию только для чтения. Достаточно хорошо работает.

person Chris Heald    schedule 12.08.2010