【问题标题】:How to sort one table has many relationship with another table in Rails 4?如何排序一个表与 Rails 4 中的另一个表有很多关系?
【发布时间】:2015-11-30 11:55:43
【问题描述】:

我有三个表供应商,cmets,works table。 我必须按 no 对所有供应商进行排序。 (admin_verified : true) 评论。如果“n”个供应商的评论数相同,则按作品数排序。

我写了一个活动记录查询,但如果供应商至少有一个经过验证的评论,它只需要供应商。 查询:

Vendor.
joins(:reviews).
where("reviews.verified"=>true).
group("reviews.vendor_id").
order("count(reviews.vendor_id)")

此查询仅在两个表之间。 如何编写rails活动记录查询以根据上述顺序对供应商进行排序?

# vendor.rb
has_many :reviews
has_many :works

# review.rb (table_fields: 'verified','comment',... and so on)
belongs_to :vendor

# work.rb (table_fields: 'work_title','work_description',... and so on)
belongs_to :vendor

【问题讨论】:

    标签: mysql ruby-on-rails ruby sorting


    【解决方案1】:

    你可以试试这样的:

    vendors = Vendor.joins('LEFT JOIN (SELECT id, vendor_id FROM reviews WHERE reviews.verified = 1) as r ON r.vendor_id=vendors.id')
                  .joins('LEFT JOIN works ON works.vendor_id=vendors.id')
                  .group('vendors.id')
                  .select('vendors.* , COUNT(DISTINCT r.id) AS no_reviews, COUNT(DISTINCT works.id) AS no_works')
                  .order('no_reviews DESC, no_works DESC')
    

    在这种情况下,您还可以从供应商对象中访问计数,例如:vendors.first.no_reviews

    【讨论】:

    • 提前致谢!但上述活动记录查询仅对已验证的评论供应商进行排序。我想根据评论对所有供应商进行排序。如果供应商没有评论,那么它将是最后一个。对于上面的查询,只给供应商有评论并且已经验证。
    • @GoldenKing 编辑了答案。我误读了这个问题。谢谢。
    • 可以优化这个查询吗?
    • @GoldenKing 我没有看到一个简单的方法来做到这一点。我想你也可以引入一些冗余并将这些计数存储在vendors 表中。您可以轻松地使它们与回调保持同步。
    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多