【问题标题】:Convert SQL query to Rails Active Record query将 SQL 查询转换为 Rails Active Record 查询
【发布时间】:2013-10-04 14:31:24
【问题描述】:

无论如何,我可以通过在下面放置几行来在 Rails 控制台中获取结果

group = UserGroup.find_by_sql("select user_group_memberships.user_group_id, sum(-bets.amount + bets.amount_paid) as bankroll_net_profit  from bets  inner join user_group_memberships ON bets.user_id = user_group_memberships.user_id GROUP BY user_group_memberships.user_group_id")

结果如下:

-+-----------------------------------+
| user_group_id | bankroll_net_profit |
+---------------+---------------------+
|             1 |                4765 |
|            57 |                1517 |
|            58 |                 -20 |
|            62 |                1517 |
|            64 |                1517 |
|            66 |                1507 |
|            67 |                 995 |
|            82 |                1517 |
-+-----------------------------------+

但我需要在 groups 变量中获取活动记录,但我得到了一个 Array(通过 group.class 检查),因此我无法在活动记录中进行额外计算。

哪位朋友可以帮我找到以上 Mysql 查询的 Active Record:我需要 Model.joins(:another_model)

关联如下:

 class UserGroup < ActiveRecord::Base
   has_many :user_group_memberships
   has_many :users, :through => :user_group_memberships

class User < ActiveRecord::Base
  has_many :user_group_memberships
  has_many :user_groups, :through => :user_group_memberships


class Bet < ActiveRecord::Base
  belongs_to :user

【问题讨论】:

    标签: mysql ruby-on-rails-3 activerecord join associations


    【解决方案1】:

    这可能不准确,但我想你会想要这样的东西:

    UserGroup.
      select('user_groups.*, sum(-bets.amount + bets.amount_paid) as bankroll_net_profit').
      joins(:users => :bets).
      group('user_groups.id')
    

    希望这至少足以为您指明正确的方向。鉴于您显示的关联,Rails 应该足够聪明,可以加入 UserGroupsUserGroupMembershipsUserGroupMembershipsUsersUsersBets

    当您使用.select 时,您可以从生成的ActiveRecord 对象中获取非属性值,因此如果将此关系保存为user_groups,您应该可以调用user_groups.first.bankroll_net_profitNote that if you're using PostGreSQL, this will be a String,并且需要使用.to_f 或其他任何方式转换为正确的数据类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 2014-03-05
      • 2021-07-05
      • 2019-01-08
      相关资源
      最近更新 更多