【问题标题】:Rails Advance query CASE WHEN method not workingRails Advance 查询 CASE WHEN 方法不起作用
【发布时间】:2015-07-31 00:25:01
【问题描述】:

当我使用完美运行的 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 方法时,我得到了两个结果,但是当我重新查询活动记录时,当我将生成的 sql 粘贴到 mysql 中时,它只显示一个,我也得到相同的结果 IF任何人都可以帮助我理解这两个查询之间的区别以及如何解决这个问题我的意思是我需要活动记录中 find_by_sql 的结果。

【问题讨论】:

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


    【解决方案1】:

    根据查询,您的方案是选择 user_one 是当前用户或 user_two 是当前用户的那些消息。所以除了复杂的查询,你可以简单地做的是这个

    Message.where("messages.user_one = ? OR messages.user_two =?", current_user, current_user).order("m_id ASC").limit(20)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-12
      • 2014-11-29
      • 2017-05-30
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多