]> source.dussan.org Git - redmine.git/commitdiff
Replaces a piggy back query with an association for loading wiki pages updates.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 28 Sep 2015 18:39:07 +0000 (18:39 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 28 Sep 2015 18:39:07 +0000 (18:39 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@14625 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/wiki_content.rb
app/models/wiki_page.rb
test/unit/wiki_page_test.rb

index 223b6ca478d914d865d740f808a88d34d0bb70f9..992e4902f7cffbd07d3547fc2ff8176880502d77 100644 (file)
@@ -29,6 +29,8 @@ class WikiContent < ActiveRecord::Base
 
   after_save :send_notification
 
+  scope :without_text, lambda {select(:id, :page_id, :version, :updated_on)}
+
   def visible?(user=User.current)
     page.visible?(user)
   end
index ff8a12a994ecddf3904d2cd972a1a364c68d14d7..988819a7793a7523ecebbd8024966f13f5bdd835 100644 (file)
@@ -23,6 +23,8 @@ class WikiPage < ActiveRecord::Base
 
   belongs_to :wiki
   has_one :content, :class_name => 'WikiContent', :foreign_key => 'page_id', :dependent => :destroy
+  has_one :content_without_text, lambda {without_text.readonly}, :class_name => 'WikiContent', :foreign_key => 'page_id'
+
   acts_as_attachable :delete_permission => :delete_wiki_pages_attachments
   acts_as_tree :dependent => :nullify, :order => 'title'
 
@@ -52,10 +54,7 @@ class WikiPage < ActiveRecord::Base
   after_save :handle_children_move
 
   # eager load information about last updates, without loading text
-  scope :with_updated_on, lambda {
-    select("#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on, #{WikiContent.table_name}.version").
-      joins("LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id")
-  }
+  scope :with_updated_on, lambda { preload(:content_without_text) }
 
   # Wiki pages that are protected by default
   DEFAULT_PROTECTED_PAGES = %w(sidebar)
@@ -183,18 +182,11 @@ class WikiPage < ActiveRecord::Base
   end
 
   def updated_on
-    unless @updated_on
-      if time = read_attribute(:updated_on)
-        # content updated_on was eager loaded with the page
-        begin
-          @updated_on = (self.class.default_timezone == :utc ? Time.parse(time.to_s).utc : Time.parse(time.to_s).localtime)
-        rescue
-        end
-      else
-        @updated_on = content && content.updated_on
-      end
-    end
-    @updated_on
+    content_attribute(:updated_on)
+  end
+
+  def version
+    content_attribute(:version)
   end
 
   # Returns true if usr is allowed to edit the page, otherwise false
@@ -244,6 +236,12 @@ class WikiPage < ActiveRecord::Base
       errors.add(:parent_title, :not_same_project)
     end
   end
+
+  private
+
+  def content_attribute(name)
+    (association(:content).loaded? ? content : content_without_text).try(name)
+  end
 end
 
 class WikiDiff < Redmine::Helpers::Diff
index 68e77a2e5daa6066d8130ff816f772b3a3b4fe53..5fb1841750d8d4ee947af24fb16887ba8479c648 100644 (file)
@@ -144,13 +144,13 @@ class WikiPageTest < ActiveSupport::TestCase
     end
   end
 
-  def test_updated_on_eager_load
-    page = WikiPage.with_updated_on.order('id').first
-    assert page.is_a?(WikiPage)
-    assert_not_nil page.read_attribute(:updated_on)
-    assert_equal Time.gm(2007, 3, 6, 23, 10, 51), page.content.updated_on
-    assert_equal page.content.updated_on, page.updated_on
-    assert_not_nil page.read_attribute(:version)
+  def test_with_updated_on_scope_should_preload_updated_on_and_version
+    page = WikiPage.with_updated_on.where(:id => 1).first
+    # make the assertions fail if attributes are not preloaded
+    WikiContent.update_all(:updated_on => '2001-01-01 10:00:00', :version => 1)
+
+    assert_equal Time.gm(2007, 3, 6, 23, 10, 51), page.updated_on
+    assert_equal 3, page.version
   end
 
   def test_descendants