我有这个使用部分SQL查询代码的rails逻辑。我想知道是否有更好的方法或更简洁的方法来做同样的事情(即使用rails&#39方法来替换SQL代码)?
@servers = Server
.select("*", "(SELECT AVG('reviews'.'average') FROM 'reviews' WHERE 'reviews'.'server_id' = 'servers'.'id') AS s_avg")
.order("s_avg DESC")
.paginate(:page => params[:page], :per_page => 25)
答案 0 :(得分:2)
首先,好处是将代码从视图或控制器移动到模型并将其包装在范围内。此外,范围可以链接。
class Server < ActiveRecord::Base
scope :averaged, -> { where(SQL CODE HERE) }
scope :expensive, -> { where('price > ?', price) }
scope :latest, -> { where('created_at > ?', Date.today - 3.days.ago) }
scope :active, -> { where(active: true) }
end
只有这样你才能在控制器中传递和链接它:
@servers = Server.latest.averaged
因此,只需尝试在几个部分上制作SQL,将这些部分移动到模型并用范围包装它们。 你可以在这里找到许多没有纯SQL的查询方法的有用例子: http://guides.rubyonrails.org/active_record_querying.html