Rails - 将current_user传递给SQL查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails - 将current_user传递给SQL查询相关的知识,希望对你有一定的参考价值。

我正在寻找一种方法将Rails / Devise变量“current_user”传递给SQL查询。

我有一个应用程序有两个模型,用户和提示。用户可以与其他用户交朋友并向对方发送提示。我正在尝试显示按用户发送给每个朋友的提示数量排序的用户朋友列表,以便用户向其发送最多提示的朋友显示在朋友列表的顶部,等等上。

我已经读过RoR没有能力轻松处理这种查询,所以我已经能够将以下SQL查询放在一起,这可以正常工作:

def friend_list
 @friends = User.find_by_sql("SELECT users.*, 
 COUNT(tips.id) AS c FROM users, tips 
 WHERE tips.recipient_id = users.id 
 AND tips.user_id = 3
 GROUP BY users.id ORDER BY c DESC")
end

唯一的问题是,我已经手动输入了user.id(“3”),理想情况下“3”将被“current_user”替换,这样每次用户加载此列表时,他们会按照他们的名字排列他们的朋友列表他们自己已经发送了提示,而不是每个人只看到用户3的排名。

在一个理想的世界中,这看起来像是:

 AND tips.user_id = current_user

但这不起作用。如何将变量传递给此查询,以便每个查看的人都不同?

更新:用户模型(摘录):

has_many :tips
has_many :received_tips, :class_name => "Tip", :foreign_key => "recipient_id"

提示模型(摘录):

belongs_to :user
belongs_to :recipient, :class_name => "User"
答案

如果使用devise,则无法访问模型中的current_user ...虽然没有什么好办法可以做到这一点

        ##method one---in your controller

        @users=User.find(current_user.id)   

        ##method two---in your controller

        @users=User.get_user_details(current_user.id)   

        ##in model
        def self.get_user_details(current_user_id)
          User.find(current_user_id)
        end

       ###you can also use in this way in controller

      @all_videos = Video.where("videos.user_id !=?",current_user.id)

.........so this can be your solution............

##in controller or pass current_user and user it in your model

def friend_list
 @friends = User.joins(:tips).select("users.* and count(tips.id) as c").where  ("tips.users_id= ?",current_user.id).group("users.id").order("c DESC")    
 ##or
 @friends = User.all(:joins => :tips, :select => "users.*, count(tips.id) as    tips_count", :group => "users.id",:order=>"tips_count DESC")

end
另一答案

你可以试试这个

def friend_list
 @friends = User.find_by_sql("SELECT users.*, 
 COUNT(tips.id) AS c FROM users, tips 
 WHERE tips.recipient_id = users.id 
 AND tips.user_id = ?
 GROUP BY users.id ORDER BY c DESC", current_user.id)
end

无论如何,使用active_record进行此查询并不困难。

另一答案

我知道这是旧的,但我想补充一点,你也可以使用字符串注入。

def friend_list

 #Declare the query string you want to pass
 @query = "SELECT users.*, 
     COUNT(tips.id) AS c FROM users, tips 
     WHERE tips.recipient_id = users.id 
     AND tips.user_id = #{current_user.id}
     GROUP BY users.id ORDER BY DESC"

 @friends = User.find_by_sql(@query)
end

以上是关于Rails - 将current_user传递给SQL查询的主要内容,如果未能解决你的问题,请参考以下文章

将current_user id分配给导入学生列表

通过隐藏字段将数组传递给rails

如何将选项传递给heroku中的rails控制台

如何从 Rails 通知访问 current_user?

Rails 设计,通过 session_store 键找到 current_user

通过电子邮件发送ActionMailer中的当前用户 - Rails 5