我正在使用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中遇到了一些麻烦。
你们有些人有一些潜在客户吗?
非常感谢。
答案 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