2016-11-03 1 views
2

модельсравнение даты> =, но не включая само

def previous_user_challenge_date_started 
    user.challenges.where('date_started >= ?', date_started).order('date_started ASC').first #date_started is a date, not datetime 
end 

Некоторые проблемы будут иметь один и тот же date_started так вот почему я хочу >=, но сейчас он продолжает перезагрузки текущего @challenge снова и снова, когда link_to.

Как я могу использовать >=, но за исключением того, что есть @challenge, поэтому, возможно, используя not self как-то в методе модели?

вид

<%= link_to '← Previous', challenge_path(@challenge.previous_user_challenge_date_started), class: "prev" %> 

контроллер

@challenge = Challenge.find(params[:id]) 

ответ

3

Прицелы действительно удобны для такого рода вещей (, clicked_id Ид =!?):

class Challenge < ActiveRecord::Base 

    belongs_to :user 

    # return challenges after a particular date 
    scope :on_or_after, ->(date) { where(arel_table[:date_started].gteq(date)) } 

    # return all but these challenges 
    scope :excluding, ->(id) { where.not(id: id) } 

    def previous_user_challenge_date_started 
    user.challenges    # get the users challenges 
    .excluding(self)   # but not this one 
    .on_or_after(date_started) # that are on or after the start date 
    .order('date_started ASC') 
    .last 
    end 

end 

Также здесь является обязательной ссылкой на потрясающая статья об использовании областей: Mastering ActiveRecord and AREL

+1

Области действительно замечательные, особенно если вы их описываете способами, которые легко прикованны. – tadman

+0

Очень хорошо. Спасибо! Я столкнулся с связанной проблемой, выходящей за рамки вопроса, если вы захотите потворствовать - так что теперь скажем, что есть три проблемы с тем же «date_started». Если пользователь нажимает 'next', он просто перебирает назад и вперед между вызовом A & challenge B, а не вызовом C. Есть идеи, как это исправить? Если вы предпочитаете, я создам новый вопрос. –

+1

Я бы занялся проблемой больше, чем разбиение на страницы над 'user.challenges'. Однако вы показываете только 1 элемент на странице. Для этого вы можете использовать 'offset' и' limit'. Или вы могли бы разработать индекс 'self' в' user.challenges.load'. Предыдущим будет 'user.challenges [index - 1]', а следующий мир - +1. Надеюсь, что вы поете работать с – br3nt

0

Почему вы не сравнить идентификатор щелкнули вызов.

Добавить еще один, где условие для id не равно щелчку вызова.

так, добавьте .гд