Rails - 将current_user传递给SQL查询

问题描述 投票:1回答:3

我正在寻找一种方法将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"
sql ruby-on-rails devise
3个回答
0
投票

如果使用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

0
投票

你可以试试这个

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进行此查询并不困难。


0
投票

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

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
© www.soinside.com 2019 - 2024. All rights reserved.