Rails - 将current_user传递给SQL查询

时间:2014-08-12 00:37:16

标签: sql ruby-on-rails devise

我正在寻找一种方法来传递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"

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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进行此查询并不困难。

答案 2 :(得分: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