Activerecord Rails3查询:如何获得浏览量最大的产品/文章/任何东西?

Activerecord Rails3查询:如何获得浏览量最大的产品/文章/任何东西?,activerecord,arel,ruby-on-rails-3,Activerecord,Arel,Ruby On Rails 3,我一直想知道如何查询和获取不适合模型的结果。类似于使用LINQ和投影到匿名对象中的方式 下面是一个简单的模式: # Product.rb class Product < ActiveRecord::Base has_many :product_views # attributes: id, name, description, created_at, updated_at end # ProductView.rb class ProductView < ActiveR

我一直想知道如何查询和获取不适合模型的结果。类似于使用LINQ和投影到匿名对象中的方式

下面是一个简单的模式:

# Product.rb
class Product < ActiveRecord::Base
   has_many :product_views

   # attributes: id, name, description, created_at, updated_at
end

# ProductView.rb
class ProductView < ActiveRecord::Base
   belongs_to :product

   # attributes: id, product_id, request_ip, created_at, updated_at
end
我尝试了以下和类似的方法,但我得到的是ProductView对象,我只想得到一个数组或任何东西

ProductView.includes(:product)
           .group('product_id')
           .select("products.id, products.name, count(product_id)")
使用简单的SQL或LINQ,这类事情很简单,但我发现自己在Rails中被这类查询绊倒了。也许我没有用著名的“rails方式”思考,也许我遗漏了一些显而易见的东西

那么,在Rails3中如何进行这种查询,特别是在这个查询中?欢迎提出任何建议来改进我的工作方式


谢谢你

我不知道是否有办法用你的模型来做。我可能会求助于:

Product.connection.select_rows(sql)

这将为您提供一个数组。如果您想使用哈希数组,可以使用
select\u all

我不知道是否有办法使用您的模型。我可能会求助于:

Product.connection.select_rows(sql)
这将为您提供一个数组。如果您想要一个哈希数组,可以使用
select\u all

试试以下方法:

@product = Product.find(#product_id)
@product_views = @product.product_views.count
(来源-)

希望这有帮助

试试这个:

@product = Product.find(#product_id)
@product_views = @product.product_views.count
(来源-)


希望这有帮助

您可以使用Arel来完成所需的工作:

products = Product.arel_table
product_views = ProductView.arel_table

# expanded for readability:
sql = products.join(product_views)
              .on(product_views[:product_id].eq(product[:id]))
              .group(product_views[:product_id])
              .order('views DESC')
              .project(products[:id],
                       products[:name],
                       product_views[:id].count.as('views'))

products_with_views = Product.connection.select_all(sql.to_sql) # or select_rows to just get the values

是的,它很长,但Arel是处理创建复杂查询的一种非常聪明的方法,无论数据库类型如何,都可以重用这些查询。

您可以使用Arel来完成所需的工作:

products = Product.arel_table
product_views = ProductView.arel_table

# expanded for readability:
sql = products.join(product_views)
              .on(product_views[:product_id].eq(product[:id]))
              .group(product_views[:product_id])
              .order('views DESC')
              .project(products[:id],
                       products[:name],
                       product_views[:id].count.as('views'))

products_with_views = Product.connection.select_all(sql.to_sql) # or select_rows to just get the values

是的,它很长,但Arel是处理创建复杂查询的一种非常聪明的方法,无论数据库类型如何,都可以重用这些查询。

在产品类的类方法中:

Product.includes(:product_views).all.map { |p| [p.id, p.name, p.product_views.size] }

然后根据需要对其进行排序。

在Product类的类方法中:

Product.includes(:product_views).all.map { |p| [p.id, p.name, p.product_views.size] }

然后根据需要进行排序。

模型可以修改,但它似乎是一个常规的“跟踪”表。产品表和产品视图(或点击)表。此外,这种查询(获取浏览量最大的产品/文章/任何东西)非常流行,我觉得奇怪的是,没有简单的方法可以做到这一点。模型可以修改,但它似乎是一个常规的“跟踪”表。产品表和产品视图(或点击)表。此外,这种查询(获取浏览量最大的产品/文章/任何东西)非常流行,我觉得奇怪的是,没有简单的方法可以做到这一点。我不需要特定产品的计数,我需要一个按视图排序的产品列表。这不会有帮助,除非我迭代每个产品并获得计数,这当然不是一个可行的解决方案。我不需要特定产品的计数,我需要一个按视图排序的产品列表。这不会有任何帮助,除非我迭代每一个产品并获得计数,这当然不是一个可行的解决方案。很棒的解决方案。我做了一点修改,得到了一个哈希数组,而不是数组数组。谢谢很高兴我能帮忙!我使用的代码返回哈希值,但为了简洁起见。:-)我唯一不喜欢的是使用IN子句,而不是内部连接。很棒的解决方案。我做了一点修改,得到了一个哈希数组,而不是数组数组。谢谢很高兴我能帮忙!我使用的代码返回哈希值,但为了简洁起见。:-)我唯一不喜欢的是使用IN子句,而不是内部联接。