Rails: отображение продуктов на основе нескольких параметров

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

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

Я использовал has_many через соединения, чтобы создать связи между продуктами, местоположением и категориями.

Вот модели:

class Product < ActiveRecord::Base  
  has_many :categorizations  
  has_many :categories, :through => :categorizations  
  has_many :localizations  
  has_many :locations, :through => :localizations  
end  

class Categorization < ActiveRecord::Base
  belongs_to :product
  belongs_to :category
end  

class Category < ActiveRecord::Base
  has_many :categorizations
  has_many :products, :through => :categorizations
end  

class Localization < ActiveRecord::Base
  belongs_to :product
  belongs_to :location
end 

class Location < ActiveRecord::Base
  has_many :localizations
  has_many :products, :through => :localizations
end 

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

class LibraryController < ApplicationController
   def index
     @products = Product.find(:all, include => [ :locations, :categories ],
                              :conditions => ['expiry_date > ? AND locations.id = ? AND categories.id = ?',
                              Time.now, params[:location_id],params[:category_id]])
   end
end

Таким образом, передав параметры location_id и category_id в URL-адресе, я могу перечислить продукты, комбинируя их.

Есть ли лучший способ добиться того, что я пытаюсь сделать?


person shane    schedule 17.09.2011    source источник
comment
Определите лучше. Ваш код в настоящее время работает? Выдает ошибки? Это медленнее, чем вы ожидаете? Какую реальную проблему вы хотите решить (т. е. какую помощь вы ищете)?   -  person jefflunt    schedule 17.09.2011
comment
Мне просто интересно, правильный ли общий подход или я иду по неправильному пути. В настоящее время код делает то, что я хочу, но когда я говорю «лучше», я имею в виду, существует ли более традиционный подход?   -  person shane    schedule 17.09.2011


Ответы (3)


В порядке. Нет, я не думаю, что есть "лучший" способ в этом случае. Конечно, есть «другие» способы делать то, что вы хотите, но на первый взгляд то, что вы делаете, прекрасно, и это не кричит «этот код ужасен!» или что-нибудь.

Здесь трудно ответить на вопросы совета/стиля, потому что в конечном итоге ответ на них таков: «поищите в Интернете, что другие люди делают в вашей ситуации, и оцените/примите решение самостоятельно, если ваше решение кажется традиционным/логичным» или Ответы на такие вопросы можно получить, изучив соответствующие книги по этой теме.

Практически невозможно ответить на такой качественный вопрос, потому что:

  1. Есть несколько способов решить любую проблему, многие из которых не являются ни «правильными», ни «неправильными».
  2. Всегда есть крайние случаи, когда люди нарушают «правила», и в этом случае даже нестандартные решения могут быть абсолютно лучшим способом что-то сделать.
  3. Вы разработчик, тот, кто строит вещь. В какой-то степени ожидается, что вы возьмете на себя руководящую роль и решите, что лучше всего

Причина, по которой я прошу вас дать определение «лучше», в первую очередь связана с пунктом 1: если вы не сообщите нам конкретный результат, которого пытаетесь достичь, все, что вы получите, это (а) ответы, полные мнений, а не направленные к определенной цели или (б) просто другой способ сделать что-то, что может помочь вам, а может и не помочь. Поэтому они не очень полезны в практическом плане.

person jefflunt    schedule 17.09.2011
comment
Спасибо за вклад, и я принимаю все ваши баллы. Я попытаюсь сформулировать другие вопросы с определенными целями, а не с субъективными запросами. - person shane; 17.09.2011

Это также будет делать то, что вы хотите:

@products = Product.find_all_by_category_id_and_location_id(params[:category_id], params[:location_id])

Можно еще пользователя Product.where что якобы лучше найти.

Для получения дополнительной информации Google "динамические поисковые системы".

person Max    schedule 17.09.2011
comment
Я пытался использовать что-то вроде вашего предложения, но получил ошибку неопределенного метода для «find_all_by_category_id_and_location_id». - person shane; 17.09.2011
comment
Извините, я не заметил, что вы использовали :through для категорий в вашей модели продукта. - person Max; 18.09.2011

Вы также можете улучшить свое решение, используя «Product.where» (предпочтительнее, чем find в rails 3.1), а также превратить их в named_scopes в Rails, например, и связать их по мере необходимости.

scope :not_expired, where('expiry_date > ?', Time.now)
person jake    schedule 17.09.2011
comment
Спасибо за это, это помогло с моим мышлением. - person shane; 25.09.2011