使用连接获取Rails数据库的数据

时间:2015-08-11 05:09:21

标签: sql ruby-on-rails database

我的数据库中有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 

但我不知道如何准确得到我想要的东西,因为我想要在注册的第一天做出的评分数量。

我该怎么做?提前谢谢。

4 个答案:

答案 0 :(得分:2)

试试这个 -

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}

答案 1 :(得分: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

答案 2 :(得分:0)

希望这对你有用。

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

答案 3 :(得分:0)

您可以使用内部查询。

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