11387


ユーザ(`User`)毎にグループ化した アクセスログ(`AccessLog`)一覧を作っております。  
表示項目で 最新のアクセス日(`newest_accessed_at`)をArelで取得したのですが、  
その内容を ActiveRecord_Relationに入れると classがArel::Tableとなり
`.page`等のメソッドが実行できなくなります｡

ActiveRecord_Relationの内容に うまく Arelの内容をマージすることは可能でしょうか?

[code]

    # model
    class User < ActiveRecord::Base
      has_many :access_logs
    end
    
    class AccessLog < ActiveRecord::Base
      belongs_to :user
    end
    
    # model or controller
      @access_logs = AccessLog.all
      @access_logs = @access_logs.group(:user_id).project(arel_table[:accessed_at].maximum.as('`newest_accessed_at`')) # ここでclassがArelになる
      # @access_logs = @access_logs.group(:user_id).select("`access_logs`.*, max(`access_logs`.`accessed_at`) AS `newest_accessed_at`") # mysqlエラー
      @access_logs = @access_logs.page(10) # Arel::Tableだと `.page`が呼び出せない
    
    # views
      <% @access_logs.each do |access_log| %>
        <tr>
          <td><%= access_log.user.id %></td>
          <td><%= access_log.user.name %></td>
          <td><%= access_log.newest_accessed_at %></td>
        </tr>
      <% end %>
    
[/code]


CC BY-SA 3.0
2015-06-12T06:45:51.790
11281
2015-06-16T01:15:08.250
9177
question
ruby-on-rails rails-activerecord
Arel::Tableの内容をActiveRecord_Relationにマージする方法


arel を where に繋ぐ、という回答になっていませんが、目的を達成するのであれば、下記が使えると考えます。

[code]

    AccessLog.group(:user).maximum(:accessed_at).each do |user, newest_accessed_at|
      p user.id
      p user.name
      p newest_accessed_at
    end
    
[/code]


CC BY-SA 3.0
2015-06-12T12:30:19.307
11292
2015-06-12T12:30:19.307
7471
11281
answer


selectメソッドも下記のようにArelのオブジェクトを引数に取れるようです。Rails 4.2で確認をしました。一度試してみてください。

[code]

    @access_logs.group(:user_id).select(arel_table[:accessed_at].maximum.as('`newest_accessed_at`'))
    
[/code]


CC BY-SA 3.0
2015-06-16T01:07:33.730
11387
2015-06-16T01:15:08.250
2015-06-16T01:15:08.250
10160
10160
11281
answer