diff --git a/app/models/concerns/subscribable.rb b/app/models/concerns/subscribable.rb new file mode 100644 index 0000000..fc97473 --- /dev/null +++ b/app/models/concerns/subscribable.rb @@ -0,0 +1,7 @@ +module Subscribable + extend ActiveSupport::Concern + + included do + has_many :subscriptions, as: 'subscribable', dependent: :delete_all + end +end diff --git a/app/models/subscription.rb b/app/models/subscription.rb new file mode 100644 index 0000000..192aacf --- /dev/null +++ b/app/models/subscription.rb @@ -0,0 +1,8 @@ +class Subscription < ActiveRecord::Base + enum status: [ :subscribed, :ignored ] + + belongs_to :user + belongs_to :subscribable, polymorphic: true, counter_cache: true + + validates :user, :subscribable, presence: true +end diff --git a/app/models/topic.rb b/app/models/topic.rb index b413dc3..0d816f9 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -1,6 +1,7 @@ class Topic < ActiveRecord::Base include Likeable include Trashable + include Subscribable belongs_to :user has_many :comments, as: 'commentable' diff --git a/db/migrate/20140104125105_create_topics.rb b/db/migrate/20140104125105_create_topics.rb index 6803c4b..9d4c823 100644 --- a/db/migrate/20140104125105_create_topics.rb +++ b/db/migrate/20140104125105_create_topics.rb @@ -7,6 +7,7 @@ class CreateTopics < ActiveRecord::Migration t.float :hot, index: true, default: 0.0 t.integer :comments_count, default: 0 t.integer :likes_count, default: 0 + t.integer :subscriptions_count, default: 0 t.boolean :trashed, default: false t.timestamps diff --git a/db/migrate/20140204164212_create_subscriptions.rb b/db/migrate/20140204164212_create_subscriptions.rb new file mode 100644 index 0000000..0483342 --- /dev/null +++ b/db/migrate/20140204164212_create_subscriptions.rb @@ -0,0 +1,11 @@ +class CreateSubscriptions < ActiveRecord::Migration + def change + create_table :subscriptions do |t| + t.belongs_to :user, index: true + t.belongs_to :subscribable, polymorphic: true, index: true + t.integer :status, default: 0 + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 4ede25e..f2a6cfd 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140204053314) do +ActiveRecord::Schema.define(version: 20140204164212) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -61,14 +61,27 @@ ActiveRecord::Schema.define(version: 20140204053314) do add_index "post_likes", ["user_id", "post_id"], name: "index_post_likes_on_user_id_and_post_id", unique: true, using: :btree + create_table "subscriptions", force: true do |t| + t.integer "user_id" + t.integer "subscribable_id" + t.string "subscribable_type" + t.integer "status", default: 0 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "subscriptions", ["subscribable_id", "subscribable_type"], name: "index_subscriptions_on_subscribable_id_and_subscribable_type", using: :btree + add_index "subscriptions", ["user_id"], name: "index_subscriptions_on_user_id", using: :btree + create_table "topics", force: true do |t| t.integer "user_id" t.string "title" t.text "content" - t.float "hot", default: 0.0 - t.integer "comments_count", default: 0 - t.integer "likes_count", default: 0 - t.boolean "trashed", default: false + t.float "hot", default: 0.0 + t.integer "comments_count", default: 0 + t.integer "likes_count", default: 0 + t.integer "subscriptions_count", default: 0 + t.boolean "trashed", default: false t.datetime "created_at" t.datetime "updated_at" end diff --git a/test/factories/subscriptions.rb b/test/factories/subscriptions.rb new file mode 100644 index 0000000..574c399 --- /dev/null +++ b/test/factories/subscriptions.rb @@ -0,0 +1,6 @@ +FactoryGirl.define do + factory :subscription do + user + association :subscribable, factory: 'topic' + end +end diff --git a/test/models/subscription_test.rb b/test/models/subscription_test.rb new file mode 100644 index 0000000..a045d1e --- /dev/null +++ b/test/models/subscription_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class SubscriptionTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end