【问题标题】:Use joins to get data on Rails Database使用连接获取 Rails 数据库上的数据
【发布时间】:2015-08-11 05:09:20
【问题描述】:

我的数据库中有users 表和ratings 表。

=> User(id: integer, created_at: datetime ….)
=> Rating(id: integer, user_id: integer, … created_at: datetime ….)

我想知道在特定时间段内注册的用户在注册的第一天创建了多少评分

获取从现在开始注册该时间段的用户的所有评分数:

User.where(:created_at => '2015-07-30'..'2015-08-01').joins(:ratings).count 

但我不知道如何准确地得到我想要的,因为我想要他们注册第一天的评分数。

我该怎么做?提前致谢。

【问题讨论】:

  • 您使用的是哪个数据库?
  • 在 Rails 上使用 Mysql

标签: sql ruby-on-rails database


【解决方案1】:

试试这个 -

User.joins(:ratings).where(created_at: '2015-07-30'..'2015-08-01').group('users.created_at').count

返回结果如下所示 -

=> {2015-07-14 07:07:10 UTC=>1, 2015-07-16 11:16:09 UTC=>1, 2015-07-17 11:22:05 UTC=>1, 2015-07-17 11:43:17 UTC=>1, 2015-07-17 11:53:12 UTC=>1, 2015-07-28 07:22:44 UTC=>1, 2015-07-28 07:24:57 UTC=>1, 2015-07-28 07:25:52 UTC=>1}

【讨论】:

  • 它返回:ActiveRecord::StatementInvalid: Mysql2::Error: Column 'created_at' in field list is ambiguous: SELECT COUNT(*) AS count_all, created_at AS created_at FROM users` INNER JOIN ratings ON ratings.user_id = users.id WHERE users.created_at BETWEEN -30' AND '2015-08-01' GROUP BY users.`created_at``
  • 编辑了group 调用,它应该是特定于用户表的。请立即尝试
  • 我猜它会返回每个用户的所有值,例如:User.joins(:ratings).where(created_at: '2015-07-30'..'2015-08-01').group('users.created_at').count (984.8ms) SELECT COUNT(*) AS count_all, users.created_at AS users_created_at FROM `users` INNER JOIN `ratings` ON `ratings`.`user_id` = `users`.`id` WHERE `users`.`created_at` BETWEEN '2015-07-30' AND '2015-08-01' GROUP BY users.created_at => {2015-07-30 00:00:00 +0900=>1587, 2015-07-30 00:00:16 +0900=>202, 2015-07-30 00:00:22 +0900=>28, 2015-07-30 00:01:39 +0900=>112, ....
  • 它返回hash,其中键是created_at,日期是count
  • 谢谢,但我怎样才能得到所有的总和?
【解决方案2】:

您需要有关评分的信息,因此通话需要从评分开始,而不是用户。您需要一个内部联接,因为您只想要一个用户的评分,并且该用户有条件。所以需要咨询rails-guide on joins

并且您有一个条件是评分和用户具有相同的日期,这通常更容易作为 SQL-String-fragment 完成,因为它跨越两个对象,这在 Arel 中很难表达。

最后你说要统计收视率。

Rating.joins(:user).
    where( user: {created_at: Date.new(2015,07,30)..Date.new(2015,08,01)}).
    where( 'DATE(users.created_at) = DATE(ratings.created_at)' ).
    count

【讨论】:

  • ActiveRecord::ConfigurationError: 未找到名为“用户”的关联;也许你拼错了?来自 /home/guinness/shared/bundle/ruby/2.1.0/gems/activerecord-3.2.13/lib/active_record/associations/join_dependency.rb:112:in `build'
  • 好吧,你还没有告诉我们你是如何建立用户和评级之间的关系的。但是当我们谈论关系时,它可能需要是“用户”而不是“用户”(当我们谈论数据库表时仍然是用户,这使得它变得有点棘手)。
【解决方案3】:

您可以对此进行用户内部查询。

Rating.joins(:users).where(user: User.where(created_at: Date.new(2015,07,30)..Date.new(2015,08,01))).count

【讨论】:

  • 我更正了:Rating.where(user_id: User.where(created_at: '2015-07-30'..'2015-08-01')).count
  • 但它返回所有评级的#
【解决方案4】:

希望这对你有用。

User.joins(:ratings).where("users.created_at BETWEEN ? and ? and users.id = ? ", '2015-07-30', '2015-08-01', current_user.id).count

【讨论】:

  • 它不起作用。它返回在此期间登录的用户所有评分。我想要的不是所有评分,而是在他们的注册日期获得的评分
  • 您只想为 current_user 生成结果。?
  • 我想要 7 月 30 日以及当天注册的用户的评分数
  • User.joins(:ratings).where("users.created_at BETWEEN ? and ? and users.id = ?", '2015-07-30','2015-08-01', current_user.id).count
  • 这里我假设 current_user 是你的注册用户,你可以根据你的 current_user.id 修改它
猜你喜欢
  • 2013-06-13
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2011-05-28
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多