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