【问题标题】:How to understand logic for advanced query in Ruby on Rails?如何理解 Ruby on Rails 中高级查询的逻辑?
【发布时间】:2011-09-09 16:14:56
【问题描述】:

我有一个用户模型

class User < ActiveRecord::Base
  has_many :messages_received, :class_name=>"Message", :foreign_key=>'receiving_id', :conditions => {:message_type => "incoming"}
  has_many :messages_sent, :class_name=>"Message", :foreign_key=>'sender_id', :conditions => {:message_type => "outgoing"}
end

现在我想获取过去 15 天内未发送任何消息的所有用户,以便通知他们。我试过这个,但它不工作。

 has_many :last_7_days_inactive_users, :class_name=>"Message", :foreign_key=>'receiving_id', :conditions =>{:messages_sent =>  ("created_at < ? "  ,Time.now - 7.days)}

如何修改此查询?

编辑

User.last_7_days_inactive_users

     ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'users.messages_sent' in 'where clause': SELECT `users`.`id` AS t0_r0, `users`.`name` AS t0_r1, `users`.`email` AS t0_r2, `users`.`phone_number` AS t0_r3, `users`.`active` AS t0_r4, `users`.`created_at` AS t0_r5, `users`.`updated_at` AS t0_r6, `users`.`groups_count` AS t0_r7, `users`.`daily_sms_count` AS t0_r8, `users`.`new_user_sms_count` AS t0_r9, `users`.`source_type` AS t0_r10, `users`.`messages_count` AS t0_r11, `users`.`salt` AS t0_r12, `users`.`hashed_password` AS t0_r13, `users`.`verified_email` AS t0_r14, `users`.`email_verification_code` AS t0_r15, `users`.`auto_generated_password` AS t0_r16, `users`.`forgot_password_code_short` AS t0_r17, `users`.`forgot_password_code_long` AS t0_r18, `messages`.`id` AS t1_r0, `messages`.`body` AS t1_r1, `messages`.`sender_number` AS t1_r2, `messages`.`time_at` AS t1_r3, `messages`.`operator` AS t1_r4, `messages`.`circle` AS t1_r5, `messages`.`receiving_number` AS t1_r6, `messages`.`sender_id` AS t1_r7, `messages`.`system_phone_number_id` AS t1_r8, `messages`.`created_at` AS t1_r9, `messages`.`updated_at` AS t1_r10, `messages`.`message_type` AS t1_r11, `messages`.`parent_id` AS t1_r12, `messages`.`receiving_id` AS t1_r13, `messages`.`group_id` AS t1_r14, `messages`.`mp_hash` AS t1_r15, `messages`.`junk` AS t1_r16, `messages`.`command` AS t1_r17, `messages`.`message_size` AS t1_r18 FROM `users` LEFT OUTER JOIN `messages` ON `messages`.`sender_id` = `users`.`id` AND `messages`.`message_type` = 'incoming' WHERE `users`.`messages_sent` = 'messages_sent.created_at < DATE_SUB(UTC_TIMESTAMP(), INTERVAL 7 DAY)'

【问题讨论】:

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


    【解决方案1】:

    请务必注意,除非您使用 Proc,否则您的时间将被评估一次且仅一次,并且将表示从加载类的那一刻起锁定的时间。在生产模式下,这将在流程的整个生命周期内持续存在,可能是几天甚至几个月。这可能不是你想要的。

    相反,在 User 上声明范围并以这种方式获取它们可能会更好:

    named_scope :last_7_days_inactive_users,
      :include => :messages_sent,
      :conditions => "messages.created_at < DATE_SUB(UTC_TIMESTAMP(), INTERVAL 7 DAY)"
    

    例如:

    inactive_users = User.last_7_days_inactive_users.all
    

    编辑:将条件表达式更新为直接,而不是哈希。

    【讨论】:

    • 它返回一个错误:- ArgumentError: Unknown key(s): includes
    • 啊,它可能是:include,我错误地将它复数,就像:joins 的情况一样,而在Rails 3 中,指令是includes,因为include 是保留字。
    • 啊,我明白了。从最初的形式争论这个已经破坏了一点。检查我的编辑。
    猜你喜欢
    • 2019-05-13
    • 2017-03-25
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多