如何在railsApp中获得更少的SQL请求

时间:2018-04-18 20:52:53

标签: ruby-on-rails ruby

我正在使用RailsApp,尤其是减少来自控制器的SQL请求。我的一个朋友告诉我将这些数据存储到散列或数组中以减少它。但是我有一些麻烦要做。

这是我的控制器的样子:

def count(var)
  var.count
end

def fb_connection(x)
  count_fb_sign_in = 0
  x.each do |user|
    count_fb_sign_in += 1 if user.facebook_token.present?
  end
  return count_fb_sign_in
end

def email_connection(x)
  count_sign_in = 0
  x.each do |user|
    count_sign_in += 1 unless user.facebook_token.present?
  end
  return count_sign_in
end

def sum_sign_in(x)
  x.sum(:sign_in_count)
end

def datetime_sign_in(x, y)
  x.where('last_sign_in_at >= ?', y).sum(:sign_in_count)
end

def bars_per_city(x)
  @places.where(region_id:x).count
end

这是我迄今为止尝试过的内容,但我不知道它是否是正确/最好的方法:

def stats
  @user = User.all
  user_data = Hash.new
  user_data["User_sum] = @user.count
  user_data["user_email"] = @user.select(:facebook_token).count
  return user_data
end

当我尝试这个时,我在index.html.haml中遇到了一些麻烦。

你们有些人有一些潜在客户吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

通常,您应该在控制器操作中创建实例变量,可以在视图中访问它们。你有一个方法def stats,它应该是一个私有方法,除非它是一个自定义路由。如果它是一种可以在控制器中的多个端点使用的方法,您可以将其添加为之前的操作:

before_action :stats, only: [:index]

def index
 @user = User.all
end

private

  def stats
    #create a hash and use symbolized keys (rails standard)
    @user_data = {
      user_sum: User.count,
      user_facebook_token_count: User.where.not(facebook_token: ['', nil]).count
    }
  end

您现在可以在视图中访问@user_data哈希,以便执行以下操作:

.content
  = @user_data[:user_sum]

您当然也可以访问@users

看起来你有很多方法应该是模型方法和/或模型范围。在你的方法中使用神秘变量名称也是不好的做法,但更好的方法是传递一些指示方法正在运行的数据类型的东西。例如:

# This looks like a User model method, and if so, you shouldn't need to pass anything
def fb_connection
  #This is much more efficient. In ruby you don't need explicit return
  #the value of the last method called gets returned.
  User.where.not(facebook_token: [nil, '']).count
end

但这又属于模型,可能只是一个类方法

#user.rb
class User
  def self.fb_connection_count
    where.not(facebook_token: [nil, '']).count
  end
end