Рефакторинг монгоидного звонка - PullRequest
0 голосов
/ 20 января 2012

Сейчас я использую 2 разных, но очень похожих запроса (разница лишь в дополнительных критериях

pop_answers = Answer.any_of(
  {:num_likes.gte=>3, :image_filename.exists=>true},
).desc(:created_at).skip(to_skip).limit(per_page).map{|a|a}

pop_answers_in_topic = Answer.any_of(
  {:num_likes.gte=>3, :image_filename.exists=>true, :topic_id=>some_id},
).desc(:created_at).skip(to_skip).limit(per_page).map{|a|a}

Как я могу рефакторинг этого?

1 Ответ

0 голосов
/ 20 января 2012

Вы можете добавить метод класса к Answer:

def self.popular(offset, limit, for_topic_id = nil)
  conditions = { :num_likes.gte => 3, :image_filename.exists => true }
  conditions[:topic_id] = for_topic_id if(for_topic_id)
  any_of(conditions).desc(:created_at).skip(offset).limit(limit).map{|a|a}
end

Или, если вы ожидаете большего, чем просто идентификатор темы:

def self.popular(offset, limit, options = { })
  conditions = { :num_likes.gte => 3, :image_filename.exists => true }.merge(options)
  any_of(conditions).desc(:created_at).skip(offset).limit(limit).map{|a|a}
end

Я не используюМонгоид, но вы можете отказаться от забавного .map{|a|a} или использовать вместо него .to_a.

Или, возможно, что-то из области видимости:

# In answer.rb
def self.popular(for_topic_id = nil)
  conditions = { :num_likes.gte => 3, :image_filename.exists => true }
  conditions[:topic_id] = for_topic_id if(for_topic_id)
  any_of(conditions)
end

# And then where you're using it...
pop_answers  = Answer.popular.desc(:created_at).skip(to_skip).limit(per_page).map{|a|a}
pop_in_topic = Answer.popular(some_id).desc(:created).skip(to_skip).limit(per_page).map{|a|a}

И мне интересно, any_of это действительно то, что вы ищете здесь, возможно, all_of будет иметь больше смысла.

...