Description
The overall goal of this assignment is to assess your ability to implement and use Active Record model relationships. This includes:
• Creating Active Record models and relationships between the models using a rails-provided generator (rails g model or rails g scaffold)
• Providing validations for models (using built-in Active Record validations as well as custom validations)
• Implementing a grandparent relationship with a :through option
• Providing bootstrap data using a seeds.rb file
• Implementing default scope queries
• Implementing aggregation queries
• Implementing advanced queries (e.g., SQL snippets)
• Implementing model/database (DB) cascades
The functional goal of this assignment is to implement relationships and query behavior for the following four (4) model classes
1. User
2. Profile
3. TodoList
4. TodoItem
Functional Requirements
1. Create several Active Record model classes – some of which will have relationships defined when they are created
• User
• Profile
• TodoList
• TodoItem
2. Create database migrations for relationships not present when the model classes were created
3. Create a DB schema for each model class and their relationships
4. Populate the DB with bootstrap data
5. Implement relationship features
6. Implement model class features
Getting Started
1. Create a new Rails application called todolists. This will look quite a bit like what you did in the module 1 assignment.
2. Add the following specification to your Gemfile.
group :test do
gem ’rspec-rails’, ’~> 3.0’
end
3. Run the bundle command to resolve new gems
4. From the todolists application root directory, initialize the rspec tests using rails generate rspec:install command.
[todolists]$ rails generate rspec:install create .rspec create spec create spec/spec_helper.rb create spec/rails_helper.rb
Add the following line to .rspec to add verbose output to test results.
–format documentation
5. Download and extract the starter set of boostrap files.
|– Gemfile ‘– spec
‘– assignment_spec.rb
• overwrite your existing Gemfile with the Gemfile from the bootstrap fileset. They should be nearly identical, but this is done to make sure the gems and versions you use in your solution can be processed by the automated Grader when you submit. Any submission should be tested with this version of the file.
• add the spec/assignment spec.rb file provided with the bootstrap fileset to the corresponding spec directory that already exists under your application root directory (e.g., application-root-directory/spec/assignment sp This file contains tests that will help determine whether you have completed the assignment.
6. Run the rspec test(s) to receive feedback. rspec must be run from the root directory of your application. All tests will (obviously) fail until you complete the specified solution.
$ rspec …
Finished in 0.02831 seconds (files took 1.39 seconds to load)
56 examples, 1 failure, 54 pending
To focus test feedback on a specific step of the requirements, add “-e rq##” to the rspec command line to only evaluate that requirement. Pad all step numbers to two digits.
$ rspec -e rq01
Run options: include {:full_description=>/rq01/}
Assignment rq01
Generate Rails application must have top level structure of a rails application
Finished in 0.00356 seconds (files took 1.3 seconds to load)
1 example, 0 failures
$ rspec -e rq02
…
Finished in 0.00422 seconds (files took 2.16 seconds to load)
6 examples, 1 failure, 5 pending Failed examples:
rspec ./spec/assignment_spec.rb:50 # Assignment rq02 User Model: User class created
7. Implement your Models and use the rspec tests to help verify your completed solution.
8. Submit your Rails app solution for grading.
Technical Requirements
An Entity Relationship (ER) diagram is provided below to help depict each Model’s relationship:
|——| 1 1 |———-|
| User |———-| Profile |
|——| |———-|
1 * |———-| 1 * |———-|
——| TodoList |———-| TodoItem |
|———-| |———-|
• User
– username – a string to hold account identity
– password digest – a string to hold password information
Reminder: Ruby/Rails conventions are that class names are CamelCase and file and method names are snake case.
You must migrate the database schema at this time and in between each of the following steps to be able to pass the rspec tests incrementally.
$ rake db:migrate
$ rspec -e rq02
Run options: include {:full_description=>/rq02/}
Assignment rq02
User Model:
User class created
User database structure in place
User class properties added should respond to #username should respond to #password_digest should respond to #created_at should respond to #updated_at
Finished in 0.19157 seconds (files took 1.27 seconds to load)
6 examples, 0 failures
3. Re-use the Profile model class and database table creation commands implemented in Assignment 1, except this time create it with a reference to User when you create the model class. The grader will look for the relationship to be included in the initial create table migration for this model class.
• Profile
– gender – a string to hold the words “male” or “female”
– birth year – a number to hold the year the individual was born
– first name – a string with given name of user
– last name – a string with family name of user
– user – a 1:1 relationship with User (i.e., Profile belongs to User)
Also define the 1:1 has one relationship in the User model class.
• User
– profile – a 1:1 relationship with Profile (i.e., User has one profile). Add appropriate options to have the User model class delete a Profile in a cascading fashion
Reminder: Relationships are only generated or migrated in the class forming the relationship (e.g., the many-side of a many:1). The inverse side of a relationship (e.g., the one-side of a 1:many) need only have the relationship declared in the model class and not in the database migration. In this case, Profile is forming the relationship in the database and User is the inverse side.
$ rake db:migrate
$ rspec -e rq03
• TodoList
$ rake db:migrate
$ rspec -e rq04
5. Create a database migration (hint: rails g migration) that adds a database reference from the TodoLists table to the Users table. The grader will look for this relationship to be formed by a database table migration.
Also define the many:1 belongs to relationship in the TodoList model class.
• TodoList
– user – a many:1 relationship with User (i.e., TodoList belongs to User)
Also define the 1:many has many relationship in the User model class.
• User
– todo lists – a 1:many relationship with TodoList (i.e., User has many todo lists). Add appropriate options to have the User model class delete a TodoList in a cascading fashion
$ rake db:migrate
$ rspec -e rq05
6. Re-use the TodoItem model class implemented in Assignment 1, except this time create it with a many:1 belongs to relationship with TodoList when you create the model class. The grader will look for the relationship to be included in the initial create table migration for this model class.
• TodoItem
– title – a string with short name for specific task
– description – a text field with narrative text for specific task
– completed – a boolean value (default=false), indicating whether item is complete
– todo list – a many:1 relationship with TodoList – TodoItem belongs to TodoList
Also define the 1:many has many relationship in the TodoList model class.
• TodoList
– todo items – a 1:many relationship with TodoItem (i.e., TodoList has many todo items). Add appropriate options to have the TodoList model class delete a TodoItem in a cascading fashion shell $ rake db:migrate $ rspec -e rq06
7. Migrate all database schema changes at this time if you have not yet done so. At this point you should have:
• four (4) create table (Users, Profiles, TodoLists, and TodoItems)
• one (1) update table migrations to add reference (TodoLists to Users)
$ rake db:migrate
$ rspec -e rq07
8. Implement a 1:many :through relationship from User to TodoItem by using the 1:many relationship from User to TodoLists as a source.
• User
– todo items – a 1:many through relationship with TodoItem through TodoLists (i.e., User has many todo items)
$ rspec -e rq08
9. Create a seeds.rb file that will clear the existing data from the model tables and load the database with
• The four users below with their birth years:
– Carly Fiorina, 1954
– Donald Trump, 1946
– Ben Carson, 1951
– Hillary Clinton, 1947
• Usernames (e.g., their last names) and a password for each User
• A Profile for each User
• Each TodoList contains five (5) TodoItems (there must be 20 total)
• Each TodoItem must have an arbitrary title and descriptions
Once the seeds.rb file is created, populate the database using rake db:seed
$ rake db:seed
$ rspec -e rq09
shell $ rspec -e rq10
11. Add validation to User and Profile models
• User
– Define a validation for username to enforce that username be supplied by using a built-in validator
• Profile
– Define custom validator that permits first name or last name to be null but not both
– Define a validation for gender to be either “male” or “female” by using a built-in validator
– Define custom validator that prevents anyone that is male (gender) from having the first name “Sue” 😉
$ rspec -e rq11
12. Add a cascade of deletes that will remove Profile, TodoList, and TodoItem rows for any User removed.
$ rspec -e rq12
13. Add a method to the User model class called get completed count, which:
• accepts a user as a parameter
• determines the number of TodoItems the User has completed using an aggregate query function
– (Hint: You are looking for the count of TodoItems associated with a specific User where completed:true)
• returns the count shell $ rspec -e rq13
14. Add a method to the Profile class, called get all profiles, which:
• accepts a min and max for the birth year
• issues a BETWEEN SQL clause in a where clause to locate Profiles with birth years that are between min year and max year
• defends itself against SQL injection when applying the parameters to the SQL clauses
• returns a collection of Profiles in ASC birth year order
$ rspec -e rq14
Self Grading/Feedback
Some unit tests have been provided in the bootstrap files and provide examples of tests the grader will be evaluating for when you submit your solution. They must be run from the project root directory.
$ rspec …
Finished in 9.56 seconds (files took 1.41 seconds to load)
56 examples, 0 failures
You can run as many specific tests you wish be adding -e rq## -e rq##shell $ rspec -e rq01 -e rq02 Submission
Submit an .zip archive (other archive forms not currently supported) with your solution root directory as the top-level (e.g., your Gemfile and sibling files must be in the root of the archive and not in a sub-folder. The grader will replace the spec files with fresh copies and will perform a test with different query terms.
|– app
| |– assets
| |– controllers
| |– helpers
| |– mailers
| |– models
| ‘– views
|– bin
|– config
|– config.ru
|– db
|– Gemfile
|– Gemfile.lock
|– lib
|– log
|– public
|– Rakefile
|– README.rdoc
|– test
‘– vendor
Last Updated: 2015-10-20




Reviews
There are no reviews yet.