【问题标题】:Rails way to make a find joining tables (Using .find method)Rails 查找连接表的方法(使用 .find 方法)
【发布时间】:2011-12-28 14:54:39
【问题描述】:

我有以下表格:

UserAction:
type_action: 字符串
entity_id:整数
日期:日期时间
user_id:int(引用用户)

问题:
文本:字符串
user_id: int (引用用户)
回答:tinyint

EntityTracker
type_track:字符串
entity_id:整数
动作:字符串
日期:日期时间

我需要知道 EntityTracker(alias et) 中有多少(计数)记录满足此条件:
- 动作 = '已回答'
- type_track = '问题'
- 日期 > 比(UserAction 中的记录日期(别名 ua),ua.entity_id=et.entity_id 和 ua.type_action=et.type_track)
- entity_id 满足条件:id=et.entity_id 的问题有 user_id=params[:user_id]


所以我必须加入 Question 和 UserAction。
有什么帮助吗?

【问题讨论】:

    标签: ruby ruby-on-rails-3 orm model


    【解决方案1】:

    可能是这样的:

    EntityTracker.find(:all,
                       :from => 'entity_trackers et',
                       :select => 'COUNT(et.id) AS count',
                       :conditions => ['et.action = ? AND
                                        et.type_track = ? AND
                                        et.date > (SELECT MAX(ua.date)
                                                   FROM user_actions ua
                                                   WHERE ua.entity_id=et.entity_id AND
                                                         ua.type_action=et.type_track) AND
                                        EXISTS (SELECT questions.id
                                                FROM questions
                                                WHERE questions.id=et.entity_id AND
                                                      questions.user_id=?)',
                                       'ANSWERED', 'QUESTION', user_id])
    

    【讨论】:

    • 如何管理嵌套选择的条件:select max(.....) 可以为空?当不为空时,像 et.date > (SELECT max....) 之类的东西
    • 这取决于数据库引擎,例如对于 MySQL,您可以使用 IFNULL:dev.mysql.com/doc/refman/5.0/en/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多