2011-01-07 2 views
1

У меня есть простой вопрос. Я хотел бы сделать это в качестве сферы:Преобразование простого запроса в сложную именованную область в RoR

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] 
    } 

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

ответ

1

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

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

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

0

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

Смежные вопросы