【问题标题】:Rails: Display products based on multiple paramsRails:基于多个参数显示产品
【发布时间】: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


【解决方案1】:

这也会做你想做的事:

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

您也可以使用Product.where,这应该比 find 更好。

更多信息,谷歌“动态查找器”。

【讨论】:

  • 我曾尝试使用类似您的建议的方法,但遇到“find_all_by_category_id_and_location_id”的未定义方法错误
  • 抱歉,我没有看到您在产品模型中的类别上使用 :through。
【解决方案2】:

好的。不,我认为在这种情况下没有“更好”的方法。当然有“不同”的方式来做你想做的事,但从表面上看,你所做的很好,它并没有尖叫“这段代码太糟糕了!”或任何东西。

建议/风格的问题在这里很难回答,因为最终的答案是“在网上搜索其他人在您的情况下所做的事情,如果您的解决方案看起来很传统/合乎逻辑,请自行评估/做出决定”,或者这类问题可以通过研究有关该主题的相关书籍来回答。

回答这样的定性问题几乎是不可能的,因为:

  1. 有几种方法可以解决每个问题,其中许多方法既不是“正确”也不是“错误”
  2. 总是存在人们打破“规则”的极端情况,在这种情况下,即使是非常规的解决方案也绝对是做某事的最佳方式
  3. 您是开发者,是构建事物的人。在某种程度上,您应该担任领导角色,并决定什么是最好的

我要求您定义“更好”的原因主要是因为 #1 - 除非您向我们提供您想要实现的特定结果,否则您将得到的只是 (a) 充满意见的答案,而不是针对特定目标或(b)只是一种不同的做某事的方式,可能会或可能不会帮助您。因此,它们在实际中并不是很有用。

【讨论】:

  • 感谢您的意见,我接受您的所有观点。我会尝试用明确的目标而不是主观查询来表达其他问题。
【解决方案3】:

您还可以通过使用“Product.where”(优于 rails 3.1 中的 find)来改进您的解决方案,并将它们转换为 Rails 中的 named_scopes,并根据需要将它们链接起来。

scope :not_expired, where('expiry_date > ?', Time.now)

【讨论】:

  • 谢谢你,这对我的思路有所帮助。
猜你喜欢
  • 2014-05-08
  • 2019-07-19
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多