From fa3ae24ca7a11f3d87c8838cf05a95dfecfa4c5c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Oct 2012 18:17:12 +0300 Subject: [PATCH] Group entity. Group has many projects --- app/models/group.rb | 22 +++++++++++++++++++ app/models/project.rb | 3 +++ db/migrate/20121002150926_create_groups.rb | 11 ++++++++++ .../20121002151033_add_group_id_to_project.rb | 5 +++++ db/schema.rb | 11 +++++++++- spec/factories/groups.rb | 21 ++++++++++++++++++ spec/models/group_spec.rb | 22 +++++++++++++++++++ spec/models/project_spec.rb | 22 +++++++++++++++++++ 8 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 app/models/group.rb create mode 100644 db/migrate/20121002150926_create_groups.rb create mode 100644 db/migrate/20121002151033_add_group_id_to_project.rb create mode 100644 spec/factories/groups.rb create mode 100644 spec/models/group_spec.rb diff --git a/app/models/group.rb b/app/models/group.rb new file mode 100644 index 00000000..f18b7d57 --- /dev/null +++ b/app/models/group.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: groups +# +# id :integer not null, primary key +# name :string(255) not null +# code :string(255) not null +# owner_id :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class Group < ActiveRecord::Base + attr_accessible :code, :name, :owner_id + + has_many :projects + belongs_to :owner, class_name: "User" + + validates :name, presence: true, uniqueness: true + validates :code, presence: true, uniqueness: true + validates :owner_id, presence: true +end diff --git a/app/models/project.rb b/app/models/project.rb index 9b13de62..9d2b99e5 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -11,6 +11,7 @@ class Project < ActiveRecord::Base attr_accessor :error_code # Relations + belongs_to :group belongs_to :owner, class_name: "User" has_many :users, through: :users_projects has_many :events, dependent: :destroy @@ -173,4 +174,6 @@ end # wall_enabled :boolean default(TRUE), not null # merge_requests_enabled :boolean default(TRUE), not null # wiki_enabled :boolean default(TRUE), not null +# group_id :integer # + diff --git a/db/migrate/20121002150926_create_groups.rb b/db/migrate/20121002150926_create_groups.rb new file mode 100644 index 00000000..ac178294 --- /dev/null +++ b/db/migrate/20121002150926_create_groups.rb @@ -0,0 +1,11 @@ +class CreateGroups < ActiveRecord::Migration + def change + create_table :groups do |t| + t.string :name, null: false + t.string :code, null: false + t.integer :owner_id, null: false + + t.timestamps + end + end +end diff --git a/db/migrate/20121002151033_add_group_id_to_project.rb b/db/migrate/20121002151033_add_group_id_to_project.rb new file mode 100644 index 00000000..683fbfec --- /dev/null +++ b/db/migrate/20121002151033_add_group_id_to_project.rb @@ -0,0 +1,5 @@ +class AddGroupIdToProject < ActiveRecord::Migration + def change + add_column :projects, :group_id, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 00bb5523..ec4729c0 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 => 20120905043334) do +ActiveRecord::Schema.define(:version => 20121002151033) do create_table "events", :force => true do |t| t.string "target_type" @@ -25,6 +25,14 @@ ActiveRecord::Schema.define(:version => 20120905043334) do t.integer "author_id" end + create_table "groups", :force => true do |t| + t.string "name", :null => false + t.string "code", :null => false + t.integer "owner_id", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "issues", :force => true do |t| t.string "title" t.integer "assignee_id" @@ -108,6 +116,7 @@ ActiveRecord::Schema.define(:version => 20120905043334) do t.boolean "wall_enabled", :default => true, :null => false t.boolean "merge_requests_enabled", :default => true, :null => false t.boolean "wiki_enabled", :default => true, :null => false + t.integer "group_id" end create_table "protected_branches", :force => true do |t| diff --git a/spec/factories/groups.rb b/spec/factories/groups.rb new file mode 100644 index 00000000..d583b186 --- /dev/null +++ b/spec/factories/groups.rb @@ -0,0 +1,21 @@ +# == Schema Information +# +# Table name: groups +# +# id :integer not null, primary key +# name :string(255) not null +# code :string(255) not null +# owner_id :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# + +# Read about factories at https://github.com/thoughtbot/factory_girl + +FactoryGirl.define do + factory :group do + name "MyString" + code "MyString" + owner_id 1 + end +end diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb new file mode 100644 index 00000000..eea196fd --- /dev/null +++ b/spec/models/group_spec.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: groups +# +# id :integer not null, primary key +# name :string(255) not null +# code :string(255) not null +# owner_id :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# + +require 'spec_helper' + +describe Group do + it { should have_many :projects } + it { should validate_presence_of :name } + it { should validate_uniqueness_of(:name) } + it { should validate_presence_of :code } + it { should validate_uniqueness_of(:code) } + it { should validate_presence_of :owner_id } +end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index bb975a93..b7d846e8 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -1,7 +1,29 @@ +# == Schema Information +# +# Table name: projects +# +# id :integer not null, primary key +# name :string(255) +# path :string(255) +# description :text +# created_at :datetime not null +# updated_at :datetime not null +# private_flag :boolean default(TRUE), not null +# code :string(255) +# owner_id :integer +# default_branch :string(255) +# issues_enabled :boolean default(TRUE), not null +# wall_enabled :boolean default(TRUE), not null +# merge_requests_enabled :boolean default(TRUE), not null +# wiki_enabled :boolean default(TRUE), not null +# group_id :integer +# + require 'spec_helper' describe Project do describe "Associations" do + it { should belong_to(:group) } it { should belong_to(:owner).class_name('User') } it { should have_many(:users) } it { should have_many(:events).dependent(:destroy) }