From 8db2a59d0b6959a78ea7be4663dd9a858dff9f98 Mon Sep 17 00:00:00 2001
From: Robert Speicher <rspeicher@gmail.com>
Date: Sat, 1 Sep 2012 23:39:28 -0400
Subject: [PATCH] Add StaticModel role, and add it to Commit model

Instead of doing this:

    link_to(commit.id, project_commit_path(project, id: commit.id))
    Note.create(noteable_id: commit.id, noteable_type: "Commit", ...)

It lets us do this:

    link_to(commit.id, project_commit_path(project, commit))
    Note.create(noteable: commit, ...)
---
 app/models/commit.rb      | 12 ++++--------
 app/roles/static_model.rb | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 8 deletions(-)
 create mode 100644 app/roles/static_model.rb

diff --git a/app/models/commit.rb b/app/models/commit.rb
index 5c6b4d88d96..15afedcb101 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -1,6 +1,7 @@
 class Commit
   include ActiveModel::Conversion
   include Gitlab::Encode
+  include StaticModel
   extend ActiveModel::Naming
 
   attr_accessor :commit
@@ -22,8 +23,7 @@ class Commit
     :to_patch,
     to: :commit
 
-
-  class << self 
+  class << self
     def find_or_first(repo, commit_id = nil, root_ref)
       commit = if commit_id
                  repo.commit(commit_id)
@@ -85,7 +85,7 @@ class Commit
       first = project.commit(to.try(:strip))
       last = project.commit(from.try(:strip))
 
-      result = { 
+      result = {
         commits: [],
         diffs: [],
         commit: nil
@@ -105,10 +105,6 @@ class Commit
     end
   end
 
-  def persisted?
-    false
-  end
-
   def initialize(raw_commit, head = nil)
     @commit = raw_commit
     @head = head
@@ -155,7 +151,7 @@ class Commit
     prev_commit.try :id
   end
 
-  def parents_count 
+  def parents_count
     parents && parents.count || 0
   end
 end
diff --git a/app/roles/static_model.rb b/app/roles/static_model.rb
new file mode 100644
index 00000000000..d26c8f47501
--- /dev/null
+++ b/app/roles/static_model.rb
@@ -0,0 +1,35 @@
+# Provides an ActiveRecord-like interface to a model whose data is not persisted to a database.
+module StaticModel
+  extend ActiveSupport::Concern
+
+  module ClassMethods
+    # Used by ActiveRecord's polymorphic association to set object_id
+    def primary_key
+      'id'
+    end
+
+    # Used by ActiveRecord's polymorphic association to set object_type
+    def base_class
+      self
+    end
+  end
+
+  # Used by AR for fetching attributes
+  #
+  # Pass it along if we respond to it.
+  def [](key)
+    send(key) if respond_to?(key)
+  end
+
+  def to_param
+    id
+  end
+
+  def persisted?
+    false
+  end
+
+  def destroyed?
+    false
+  end
+end
-- 
GitLab