【问题标题】:How would I do this JOIN in Rails?我将如何在 Rails 中执行此 JOIN?
【发布时间】:2009-12-04 20:05:50
【问题描述】:

这是我的 SQL 语句:

SELECT * 
    FROM `message_users`
    LEFT JOIN `messages` ON message_users.message_id = messages.id
    WHERE (message_users.user_id = 1 AND message_users.hidden = 0)  AND message_users.last_read_at > messages.updated_at
    ORDER BY messages.updated_at DESC LIMIT 0, 20

我将如何通过适当的 Rails 连接/包含/其他方式实现这一目标?

【问题讨论】:

    标签: sql mysql ruby-on-rails


    【解决方案1】:

    您通常不会将多个表中的所有数据加载到 Rails 中的一个模型中。更常见的是将下面的 joins 替换为 include,这将预加载关联的模型,以便在调用 message.message_users 时访问缓存。无论如何,只要 messagesmessages_users 之间没有列名冲突,这应该会复制您的 sql 正在执行的操作。

    如果查询完成后不需要messages_users的数据,可以去掉select片段。

    Message.find(:all, :joins=>:message_users, :select=>"message_users.*, messages.*", :conditions=>['message_users.user_id = ? and message_users.hidden = ? and message_users.last_read_at > messages.updated_at', 1,0], :order=>"messages.updated_at desc", :limit=>20)

    关于 joinsinclude here

    之间的区别的很好的截屏视频

    【讨论】:

    • 谢谢!完美运行,我很欣赏额外的信息。
    • 没问题 - 第二个想法我只是将其保留为 :joins 除非您确实需要在查询后访问 message_users 数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2018-10-22
    • 1970-01-01
    • 2023-01-09
    • 2023-03-18
    相关资源
    最近更新 更多