2013-12-07 2 views
1

В show зрения моего products я использую следующую функцию, чтобы связать к следующему продукту (по заказу price):Как отсортировать товары по одной цене в Ruby on Rails?

class Product < ActiveRecord::Base 

    belongs_to :user 

    def next 
    Product.where("user_id = ? AND price > ?", user_id, price).order("price ASC").first 
    end 

end 

Эта функция работает до тех пор, как все продукты отличаются по цене. В тот момент, когда у двух продуктов есть то же цена, хотя функция больше не работает, потому что она всегда ищет выше цена.

Как я могу сделать так, чтобы user мог щелкнуть через все его продукты, используя функцию выше, даже если некоторые товары не отличаются по цене?

Я попытался заменить > на >=, но это всегда будет возвращать один и тот же продукт, оставив функцию практически бесполезной.

Может ли кто-нибудь помочь?

+0

Пробуя этот 'Product.order (« цена ASC »). Где (« user_id =? AND price>? », User_id, price) .first' –

+0

@Monk_Code: К сожалению, здесь тоже не работает – Tintin81

ответ

2

Этот метод может работать только в том случае, если продукты строго упорядочены. Решение может быть сортировать их по цене первого и следующего по идентификатору (условие немного более сложным и):

def next 
    Product.where("user_id = :user_id AND (price > :price OR (price = :price AND id > :id))", user_id: user_id, price: price, id: id) 
    .order("price ASC, id ASC").first 
end 

Если продукты имеют unique имя или метку, вы можете использовать этот атрибут вместо этого на ид , поэтому продукты с одинаковой ценой сортируются в алфавитном порядке, что может иметь больше смысла, чем идентификатор.

+0

Удивительный, это работает! Спасибо. Можете ли вы объяснить, почему вы используете такие символы, как ': user_id' внутри метода where? Я этого раньше не видел, и сейчас просматриваю документацию. – Tintin81

+2

Поскольку '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Это более читаемо. – Baldrick

+0

ОК, понял. Спасибо большое за вашу поддержку. – Tintin81

1

Больше >= плюс разные product_id

def next 
    Product. 
    where("id <> ?", id). 
    where("user_id = ?", user_id). 
    where("price >= ?", price). 
    order("price ASC"). 
    first 
end 
+0

Если есть 2 продукта с одинаковой ценой, этот метод будет идти туда и обратно между этими двумя продуктами, потому что там не отсортировано по id. – Baldrick

+0

Да, это именно то, с чем я сейчас борюсь. Не могу заставить его работать. – Tintin81

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