Rails:在几个类别中获取随机产品

时间:2011-03-16 17:11:35

标签: ruby-on-rails ruby-on-rails-3

我对Rails 3中的随机条目有疑问。 我有两个模型:

class Product < ActiveRecord::Base
  belongs_to :category

  self.random
    Product.find :first, :offset => ( Product.count * ActiveSupport::SecureRandom.random_number ).to_i
  end
end

class Category < ActiveRecord::Base
  has_many :products
end

我可以使用随机偏移castet到int中获得所有产品中的随机产品。但我希望能够在几个给定的类别中获得随机产品。我试过这样的东西,但这不起作用,因为偏移索引:

class Product < ActiveRecord::Base
  belongs_to :category
  self.random cat=["Mac", "Windows"]
    joins(:categories).where(:categories => { :name => cat }).where(:first, :offset => ( Product.count * ActiveSupport::SecureRandom.random_number ).to_i)
  end
end

这里有谁知道更好的解决方案?

THX! TUX

2 个答案:

答案 0 :(得分:1)

您可以尝试简化一下:

class Product < ActiveRecord::Base
  def self.random(cat = nil)
    cat ||= %w[ Mac Windows ]

    joins(:categories).where(:categories => { :name => cat }).offset(ActiveSupport::SecureRandom.random_number(self.count)).first
  end
end

Rails 3有许多方便的辅助方法,如offsetfirst,可以减少需要传递给where子句的参数数量。

如果您在加入时遇到问题,那么匹配的产品数量总计小于产品数量,则需要使用ORDER BY RAND()。在大多数情况下,它实际上并不是那么大的交易性能,您可以随时进行基准测试以确保它适合您。

答案 1 :(得分:0)

偏移发生在订单之后,因此您可以添加.order('rand()')然后您将获得来自多个类别的随机元素。但由于订单是随机的,您也不再需要抵消。所以只是:

class Product < ActiveRecord::Base
  belongs_to :category
  self.random cat=["Mac", "Windows"]
    joins(:categories).where(:categories => { :name => cat }).order('rand()').first
  end
end