diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 2a33bae24f37b42e5099dbbef1419b6d94062042..8f82c7c5e66f1fc80eaddc542e7d894c9b70d8d5 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -148,9 +148,8 @@ module ApplicationHelper end def project_last_activity project - activity = project.last_activity - if activity && activity.created_at - time_ago_in_words(activity.created_at) + " ago" + if project.last_activity_date != project.created_at + time_ago_in_words(project.last_activity_date) + " ago" else "Never" end diff --git a/app/models/event.rb b/app/models/event.rb index 90376e73753045f6df7547ae285f3f641421fbd8..6559fcc5c55afdde08e3d474e7712a4632cb908f 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -38,7 +38,7 @@ class Event < ActiveRecord::Base delegate :title, to: :merge_request, prefix: true, allow_nil: true belongs_to :author, class_name: "User" - belongs_to :project + belongs_to :project, touch: true belongs_to :target, polymorphic: true # For Hash only diff --git a/app/models/project.rb b/app/models/project.rb index 5d0cdd64dc17e63bf0e3decff32b57d54a559621..49d7b8b84934bb06f65d6aa42cfe6327396511d9 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -230,7 +230,8 @@ class Project < ActiveRecord::Base end def last_activity_date - last_event.try(:created_at) || updated_at + # touched when any associated event is saved + updated_at end def project_id diff --git a/db/migrate/20121227190440_touch_projects_last_activity.rb b/db/migrate/20121227190440_touch_projects_last_activity.rb new file mode 100644 index 0000000000000000000000000000000000000000..e278dc269aa335b52e2739b99e9ba93ae4fdc7ad --- /dev/null +++ b/db/migrate/20121227190440_touch_projects_last_activity.rb @@ -0,0 +1,18 @@ +class TouchProjectsLastActivity < ActiveRecord::Migration + def up + Project.record_timestamps = false + + Project.find_each do |project| + last_event = project.events.order(:created_at).last + if last_event and last_event.created_at > project.updated_at + project.update_attribute(:updated_at, last_event.created_at) + end + end + + Project.record_timestamps = true + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/schema.rb b/db/schema.rb index 7de5593285a535bab81a95c52641c4927fa586cd..2c974758b8e181859f8ff9b3cceed05a97ccb4b5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20121219095402) do +ActiveRecord::Schema.define(:version => 20121227190440) do create_table "events", :force => true do |t| t.string "target_type" diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index 82b46b68b64d5cb3e11848bdf22e47016ea29083..9dd8f1dae53ab4e2c190faa35eea6bdcb32954b5 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -30,6 +30,17 @@ describe Event do it { should respond_to(:commits) } end + describe "Save" do + let(:event) { create(:event) } + let(:project) { create(:project) } + + it "should touch associated project" do + event.stub(project: project) + event.project.should_receive(:touch) + event.save! + end + end + describe "Push event" do before do project = create(:project) diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 83a769760987b719e10892723c78ae797bed01d0..92923cefa0cf2c9dd9e22975b3dc2f17d72de463 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -163,22 +163,18 @@ describe Project do describe "last_activity methods" do let(:project) { create(:project) } - let(:last_event) { double(created_at: Time.now) } + let(:last_event) { create(:event) } describe "last_activity" do - it "should alias last_activity to last_event"do + it "should alias last_activity to last_event" do project.stub(last_event: last_event) project.last_activity.should == last_event end end - describe 'last_activity_date' do - it 'returns the creation date of the project\'s last event if present' do - project.stub(last_event: last_event) - project.last_activity_date.should == last_event.created_at - end - - it 'returns the project\'s last update date if it has no events' do + describe "last_activity_date" do + it "should alias last_activity_date to updated_at" do + project.stub(updated_at: Time.now) project.last_activity_date.should == project.updated_at end end