Rails: отображение товаров на основе нескольких параметров - PullRequest
0 голосов
/ 17 сентября 2011

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

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

Я использовал 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, я могу перечислить продукты по комбинации обоих.

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

Ответы [ 3 ]

1 голос
/ 17 сентября 2011

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

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

Вы также можете использовать Product.where, что, предположительно, лучше, чем найти.

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

0 голосов
/ 17 сентября 2011

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

scope :not_expired, where('expiry_date > ?', Time.now)
0 голосов
/ 17 сентября 2011

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

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

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

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

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

...