Преобразование простого запроса в хитросплетенную область в RoR - PullRequest
1 голос
/ 07 января 2011

У меня есть простой вопрос.Я хотел бы сделать это как область действия:

if article.responses.blank?
      return false
elsif article.responses.last.passed.eql?(false)
      return true
else
   return false
end

Так что на модели статьи у меня будет что-то вроде этого:

scope :failed_response, {
    :joins=>[:responses],
    :conditions=>["responses.passed = ?", false]
  }

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

Ответы [ 2 ]

1 голос
/ 07 января 2011

Единственное, о чем я могу подумать в данный момент, это подзапрос внутри области действия:

named_scope :failed_response, {
  :conditions => ["(SELECT passed FROM responses WHERE 
     responses.article_id = articles.id ORDER BY id DESC LIMIT 1) = ?", false]
}

Я думаю, что есть какой-то способ Rails, который немного лучше или способ без подзапроса,но я не могу думать об этом в данный момент.Надеюсь, это поможет.:)

0 голосов
/ 08 января 2011

Я бы сказал, чтобы было понятнее, чем умнее. Имейте метод экземпляра, чтобы возвратить last_reponse для той отдельной статьи, и затем есть другой метод экземпляра, чтобы возвратить логическое значение, является ли это истиной или ложью Это может быть не так быстро, как область имен с одной строкой SQL. Но я все еще делаю это ясным путем для лучшей ремонтопригодности / понимания.

...