簡體   English   中英

如何通過模型動作對紅寶石數組進行排序?

[英]how to sort ruby array by model action?

我正在嘗試創建一個基於社交網絡的咖啡館搜索服務之類的項目,並且我想按其他用戶給出的分數對Cafe數組進行排序。

class Cafe < ActiveRecord::Base

  belongs_to :user

  has_many :posts, dependent: :destroy
  has_many :tags, dependent: :destroy
  has_many :payments, dependent: :destroy
  has_many :payinfos, dependent: :destroy
  mount_uploader :image,CafeimageuploaderUploader
  mount_uploader :thumnail,CafeimageuploaderUploader

  geocoded_by :address
  after_validation :geocode
  def avg
    total = 0
    posts.each do |c|
      total += c.score
    end
    if posts.count == 0
        0
    else
      total.to_f / posts.count
    end
  end
end

這是Cafe模型,“ avg”是用戶給出的平均點數。

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|

      t.string :content              , null: false, default: ""
      t.string :image
      t.string :address              , null: false, default: "위치정보 없음"
      t.string :hashstr
      t.datetime :writtentime
      t.integer :user_id
      t.integer :cafe_id             , null: false, default: 0
      t.integer :score, default:0
      t.timestamps null: false
    end
  end
end

這是帖子專欄。

我想做的是通過這個avg動作對新的Cafe數組進行排序。(它稱為模型動作,對嗎?)

給我一些建議,謝謝。

我將向咖啡館模型添加屬性average_score並向模型添加after_save回調方法。 如果可以確保張貼安全,則可以使用外鍵獲取咖啡館的所有帖子,計算平均分數並將其保存到咖啡館,或者觸發咖啡館模型的方法來做到這一點。 這樣您就可以輕松對咖啡館進行分類。

讓我們使用db查詢,它效率更高。 (假設Cafe's table name is cafes

Cafe.joins("LEFT OUTER JOIN (SELECT cafe_id, AVG(score) AS avg_score
                             FROM posts
                             GROUP BY cafe_id
                            ) AS temp
            ON cafes.id = temp.cafe_id
          ").order('temp.avg_score DESC NULLS LAST')

理想情況下,我們首先在臨時表中計算平均分數,然后通過cafe_idCafe cafe_id 之后,我們可以通過avg_score輕松使用order 因為我們使用的是LEFT OUTER JOIN ,所以沒有任何帖子的cafeavg_score將為NULL ,因此我們使用NULLS LAST來確保cafe會在最后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM