【发布时间】:2011-09-18 03:41:12
【问题描述】:
我正在学习 rails 并尝试建立一个产品库,其中将根据三个元素显示产品:位置、类别和有效期(产品可以有多个位置和类别,但只有一个有效期)。只要产品的有效期尚未过去,就会显示产品,并且将通过下拉菜单选择位置和类别。
我开始写这个问题时,我很难将我找到解决方案的位置和类别选择标准纳入其中,但非常感谢任何关于可以做得更好的帮助。
我使用 has_many through connections 来创建产品、位置和类别之间的连接。
这是模型:
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
这是我的控制器。位置和类别 ID 作为参数传递,产品的到期日期必须大于当前时间:
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 参数,我可以通过两者的组合列出产品。
有没有更好的方法来实现我想要做的事情?
【问题讨论】:
-
定义“更好”。您的代码当前有效吗?它会抛出错误吗?它比您预期的要慢吗?您想要改进的实际问题是什么(即您正在寻找什么样的帮助)?
-
我只是想知道整体方法是否正确,或者我是否走错了路。该代码目前可以满足我的要求,但是当我说得更好时,我的意思是有更传统的方法吗?
标签: ruby-on-rails ruby-on-rails-3 associations params