在rails中嵌套选择(SQL到Rails转换)

时间:2014-08-08 06:19:32

标签: sql ruby-on-rails

我有这个使用部分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)

1 个答案:

答案 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