Я изучаю рельсы и пытаюсь настроить библиотеку продуктов, в которой продукты будут отображаться на основе трех элементов: местоположение, категория и срок годности (продукты могут иметь несколько местоположений и категорий, но только один срок действия). Продукты будут отображаться до тех пор, пока не истек срок их годности, а выбор местоположения и категории будет осуществляться через раскрывающиеся меню.
Я начал писать этот вопрос, имея трудности с включением критериев выбора местоположения и категории, для которых я нашел решение, но любая помощь в том, что можно было бы сделать лучше, очень ценится.
Я использовал 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-адресе, я могу перечислить продукты, комбинируя их.
Есть ли лучший способ добиться того, что я пытаюсь сделать?