Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails查询无法正常工作_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails查询无法正常工作

Ruby on rails Rails查询无法正常工作,ruby-on-rails,Ruby On Rails,我有一个带有过滤器的页面,它不能正常工作,如果设置了所有过滤器,它就可以工作。 但是如果没有设置类别过滤器,而另外两个设置了,它将无法工作(它会显示所有产品)。和以前一样,如果设置了类别,并且再次设置了“价格不是股票”,则只显示按类别过滤的内容。 我的型号是product.rb def self.categorized(category=nil) return self.where("category_id LIKE ?",category ) if category self end

我有一个带有过滤器的页面,它不能正常工作,如果设置了所有过滤器,它就可以工作。 但是如果没有设置类别过滤器,而另外两个设置了,它将无法工作(它会显示所有产品)。和以前一样,如果设置了类别,并且再次设置了“价格不是股票”,则只显示按类别过滤的内容。 我的型号是product.rb

def self.categorized(category=nil)
  return self.where("category_id LIKE ?",category ) if category
  self
end
def self.priced(price=nil)
  return self.where("price < 50") if price=="low"
  return self.where("price < 100 and price > 50") if price=="mid"
  return self.where("price > 100") if price=="high"
  self
end

def self.stocked(stock=nil)
  return self.where("stock > 0") if stock=="available"
  return self.where("stock = 0" ) if stock=="out"
  self
end
def self.catalog(params)
 page = params[:page]
 category = params[:category]
 stock = params[:stock]
 price = params[:price]
 self.stocked(stock).priced(price).categorized(category)
  .paginate(:page =>page).limit(9)
end
def self.categorized(类别=nil)
返回self.where(“category\u id LIKE?”,category)如果是category
自己
结束
def自定价(价格=零)
返回self.where(“价格<50”),如果价格=“低”
返回self.where(“价格<100,价格>50”),如果价格=“中间”
返回self.where(“价格>100”),如果价格=“高”
自己
结束
def自库存(库存=零)
返回self.where(“库存>0”),如果库存==“可用”
返回self.where(“stock=0”),如果stock==“out”
自己
结束
def自我目录(参数)
页面=参数[:页面]
类别=参数[:类别]
股票=参数[:股票]
价格=参数[:价格]
自有库存(库存)。定价(价格)。分类(类别)
.paginate(:page=>page).limit(9)
结束

你的问题是
自我
并不是你所期望的那样。因为这些是类级方法
self
总是引用“普通”类,而不是已经“聚合”了您使用的where子句的类。这里需要返回的内容不会改变到目前为止的链式查询

def self.categorized(category=nil)
  return self.where("category_id LIKE ?",category ) if category
  scoped
end
应该有用


(更新了我的答案,不确定该产品是否达到了我的预期。没有一款产品达到了我的预期效果,它仅适用于Rails 4.0)。

您的问题是
self
与您的预期不符。因为这些是类级方法
self
总是引用“普通”类,而不是已经“聚合”了您使用的where子句的类。这里需要返回的内容不会改变到目前为止的链式查询

def self.categorized(category=nil)
  return self.where("category_id LIKE ?",category ) if category
  scoped
end
应该有用

(更新了我的答案,不确定该产品是否达到了我的预期效果,并且它仅适用于Rails 4.0)。

使用范围

scope :priced, where("price < 50")
scope :stocked, where("stock > 0")
使用范围:

scope :priced, where("price < 50")
scope :stocked, where("stock > 0")


试着去掉自己。内在的自我定价和自我评价。stocked@Thahakp这会打破锁链,不会像这样工作。。。def self.priced(price=nil)where(“price<50”)如果price==“low”where(“price<100,price>50”)如果price==“mid”where(“price>100”)如果price==“high”end如果你想连锁,你必须使用范围。@Thahakp,不,你不必这样做,这是另一种选择。(我同意scope可能是更像Rails的方式,但从技术上讲OP所做的是可以的。)在删除self之后尝试。内在的自我定价和自我评价。stocked@Thahakp这会打破锁链,不会像这样工作。。。def self.priced(price=nil)where(“price<50”)如果price==“low”where(“price<100,price>50”)如果price==“mid”where(“price>100”)如果price==“high”end如果你想连锁,你必须使用范围。@Thahakp,不,你不必这样做,这是另一种选择。(我同意范围可能是更像Rails的方式,但从技术上讲OP所做的是可以的。)是的,这是可行的。虽然为了更好的OOP设计,您仍然应该在scope方法中使用Null关系。这样,您就不必担心所有那些
if stock
以及最后类似的事情,只需返回Product.none,如果没有适用的属性,您就可以链接范围。当您这样做时,外部世界需要了解scope方法是如何工作的。是的,这是可行的。虽然为了更好的OOP设计,您仍然应该在scope方法中使用Null关系。这样,您就不必担心所有那些
if stock
以及最后类似的事情,只需返回Product.none,如果没有适用的属性,您就可以链接范围。当你这样做的时候,外部世界需要了解scope方法是如何工作的。顺便说一下:我认为你必须做
@products=@products.stocked(stock)if stock
if我们添加Product.none if stock.nil?在stock范围内,如果stock==nil,则获取空结果。下一行调用此结果的定价范围。定价范围内的Where子句将附加到空产品。那么结果总是空的。如果我错了,请纠正我。似乎我错了ActiveRecord的功能。我认为如果您使用
作用域
作为返回值,这应该会产生预期的效果,它不会改变已经应用的作用域的任何内容,但仍然可以链接。是的,这会起作用。虽然为了更好的OOP设计,您仍然应该在scope方法中使用Null关系。这样,您就不必担心所有那些
if stock
以及最后类似的事情,只需返回Product.none,如果没有适用的属性,您就可以链接范围。当您这样做时,外部世界需要了解scope方法是如何工作的。是的,这是可行的。虽然为了更好的OOP设计,您仍然应该在scope方法中使用Null关系。这样,您就不必担心所有那些
if stock
以及最后类似的事情,只需返回Product.none,如果没有适用的属性,您就可以链接范围。当你这样做的时候,外部世界需要了解scope方法是如何工作的。顺便说一下:我认为你必须做
@products=@products.stocked(stock)if stock
if我们添加Product.none if stock.nil?在stock范围内,如果stock==nil,则获取空结果。下一行调用此结果的定价范围。定价范围内的Where子句将附加到空产品。那么结果总是空的。如果我错了,请纠正我。似乎我错了ActiveRecord的功能。我认为如果使用
作用域
作为返回值,这应该会产生预期的效果,它不会改变已经应用的作用域的任何内容,但仍然可以链接。