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