我对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
答案 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有许多方便的辅助方法,如offset
和first
,可以减少需要传递给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