【发布时间】: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