1

私の Rails アプリは、auditor gemを次のように使用して、2 つのモデルの変更履歴を取得しています。

@audit = Audit.where( :auditable_id => current_user.posts,
                      :auditable_type => "Post") +
         Audit.where( :auditable_id  => @comments,
                      :auditable_type => "Comment")

@auditこれは機能しますが、変更が行われた時点で変数全体をソートする必要があります。

解決すべき問題が 2 つあります。

  1. 次の方法は機能しませんでした: sortsort_byorder
  2. 次のどのフィールドで並べ替える必要があるかを把握する必要があります。

    => Audit(id: integer, auditable_id: integer, auditable_type: string, owner_id: integer, owner_type: string, user_id: integer, user_type: string, action: string, audited_changes: text, version: integer, comment: text, **created_at**: datetime) 
    
    1.9.3-p194 :002 > Audit.last
    Audit Load (168.0ms)  SELECT "audits".* FROM "audits" ORDER BY version DESC, created_at DESC LIMIT 1
    => #<Audit id: 5, auditable_id: 58, auditable_type: "Post", owner_id: 58, owner_type: "Post", user_id: 1, user_type: "User", action: "update", audited_changes: {"status"=>["to approve", "to review"], " **updated_at** "=>[2012-08-24 15:29:26 UTC, 2012-08-24 19:29:52 UTC]}, version: 2, comment: "post modified by Bruno Amaral ", created_at : "2012-08-24 19:29:52"> 
    
4

2 に答える 2

1

関心のあるすべてのオブジェクトをロードする単一のクエリを作成できるはずAuditです。これは単一のクエリであるため、データベースは並べ替えも処理できます。

実行したいSQLは次のようになります。

SELECT *
FROM audits
WHERE
  auditable_type = 'Post' AND auditable_id = … OR
  auditable_type = 'Comment' AND auditable_id IN (…)
ORDER BY created_at

次のようなものでArelを使用して構築できるはずです(Rails 3を使用していると仮定します):

t = Audit.arel_table
for_post = t[:auditable_type].eq('Post').and(t[:auditable_id].eq(post.id))
for_comments = t[:auditable_type].eq('Comment').and(t[:auditable_id].in(comment_ids))

audits = Audit.where(for_post.or(for_comments)).order(:created_at)

Arel で複雑なクエリを作成する方法の詳細については、ASCIIcasts エピソード 215Arel READMEを参照してください。

Arel 構文が気に入らない場合は、 に文字列を使用find_by_sqlまたは渡すwhereこともできますが、Arelを使用すると、さまざまな種類のエラーやデータベース間の微妙な違いから保護されることに注意してください。

于 2012-08-25T14:03:50.117 に答える
0
@audit = Audit.where( "auditable_id IN (?) OR auditable_id IN (?)",
                       current_user.posts,
                       @comments ).order_by( :created_at )
于 2012-08-25T14:11:56.073 に答える