Rails提前查询CASE WHEN方法不起作用

时间:2015-07-31 00:25:02

标签: mysql ruby-on-rails rails-activerecord

当我使用完美的mysql时,是否有人可以向我建议Find_by_sql查询的解决方案。但是,当我将其转换为活动记录时,它没有显示确切的结果。首先,我使用find_by_sql尝试了以下代码:

    @message3 = Message.find_by_sql(["SELECT u.id,c.m_id,u.name,u.email
 FROM messages c, users u
 WHERE (CASE 
 WHEN c.user_one = :id
 THEN c.user_two = u.id
 WHEN c.user_two = #{current_user.id}
 THEN c.user_one= u.id
 END )
 AND (
 c.user_one ='1'
 OR c.user_two ='1'
 )
 Order by c.m_id DESC Limit 20", {:id => current_user.id}])

当我使用这个查询时,我得到了我想要的确切值,但是当我以活动记录方式做这件事时它运行不正常这里是我在活动记录样式中尝试的代码:

@message = Message.select(:user_one, :user_two).distinct.where("user_one = ? OR user_two = ? " , current_user ,current_user)
    @m1 = Message.joins(:user).select("users.id,messages.m_id,users.name,users.email").where("CASE WHEN messages.user_one = #{current_user.id} THEN messages.user_two = users.id WHEN messages.user_two = #{current_user.id} THEN messages.user_one = users.id END").where("messages.user_one = 1 OR messages.user_two = 1 ").order("messages.m_id DESC")

当我运行此查询时,我收到此生成查询:

SELECT users.id,messages.m_id,users.name,users.email FROM `messages` INNER JOIN `users` ON `users`.`id` = `messages`.`user_one` WHERE (CASE WHEN messages.user_one = 1 THEN messages.user_two = users.id WHEN messages.user_two = 1 THEN messages.user_one = users.id END) AND (messages.user_one = 1 OR messages.user_two = 1 )  ORDER BY messages.m_id DESC

这两个查询看起来都一样,但是当我使用find_by_sql方法时,我得到两个结果但是当我重新查询活动记录时,它只显示一个当我在mysql中粘贴生成的sql时我也得到相同的结果IF任何人都可以帮助我理解这两个查询之间的区别以及如何解决这个问题我的意思是我需要在活动记录中找到find_by_sql的结果。

1 个答案:

答案 0 :(得分:0)

根据查询,您的方案是选择那些user_one是当前用户或user_two是当前用户的消息。所以你可以做的就是这个

而不是复杂的查询
Message.where("messages.user_one = ? OR messages.user_two =?", current_user, current_user).order("m_id ASC").limit(20)

现在为用户添加详细信息。您可以遍历视图中的消息并为每条消息获取用户并显示该消息。或者你可以制作哈希数组并将其返回到视图中。