listable 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/README.rdoc +72 -2
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/listable.gemspec +2 -2
  5. metadata +4 -4
@@ -2,10 +2,80 @@
2
2
 
3
3
  With listable you can consolidate fields from several models into one, backed up by a database view.
4
4
  It is perfect for e.g. a front page where you may want to display the most recent additions to your site in a joint list.
5
- By providing scopes for each model you wish to include in a view, Listable will automatically create the database view for you.
5
+ By providing scopes for each model you wish to include in a view, listable will automatically create the database view for you.
6
+ The view model and the models it lists will have a polymorphic association for convenience.
7
+ Listable currently supports the following connection adapters: SQLite, PostgreSQL and MySQL2.
6
8
 
7
9
  == How to use
8
- Coming soon...
10
+ This chapter shows some basic examples of all the steps needed to get started.
11
+
12
+ === Configuring the models
13
+ Every model that should be listable in the same context must provide a scope that select columns of the same name,
14
+ in the same order and with compatible data types. Listable extends ActiveRecord with two query methods to make this easy
15
+ without being forced to write database specific SQL in your models.
16
+ N.B. The timestamps "created_at" and "updated_at" will be include automatically, so don't include them in the scope.
17
+
18
+ Here is a basic example:
19
+ class Employee << ActiveRecord::Base
20
+ # This model will be listable through the view backed model ListItem,
21
+ # with the data provided by the "listables" scope
22
+ listable_through :list_item, :listables
23
+
24
+ # The "first_name" and "last_name" columns will be concatenated and selected as "name"
25
+ scope :listables, concat_select([:first_name, ' ', :last_name], :name)
26
+ end
27
+
28
+ class Article << ActiveRecord::Base
29
+ # You can also provide the target model name in plural if that feels more natural for you
30
+ listable_through :list_items, :listables
31
+
32
+ # The select_as method takes a hash as argument, the keys are the original column names
33
+ # and the values are their new names
34
+ scope :listables, select_as(title: 'name')
35
+ end
36
+
37
+ class ListItem << ActiveRecord::Base
38
+ # This method call is needed to configure the model correctly
39
+ acts_as_listable_view
40
+ end
41
+
42
+ === Creating the database views
43
+ You can create the database views by running the rake task <em>listable:migrate</em>.
44
+ But you will hardly ever need to do that since all listable views are automatically (re)created when running
45
+ Rails' <em>db:migrate</em>.
46
+
47
+ ==== Why not generate Rails migrations to create the views?
48
+ I believe it is very awkward to create views through migrations for several reasons.
49
+ The basic role of a migration is to either add or remove columns where you can store data.
50
+ When creating a view, you are not adding more means to store data. You are just creating an alternative
51
+ view of what's already there.
52
+
53
+ Since a view is 100% dependant on your existing columns, you will need
54
+ to recreate the view everytime you need to change the columns it depend on. Because that's the thing with
55
+ views, everytime you need to change it, you will have to drop it and create it again from scratch.
56
+ You can imagine how ugly, and not so very DRY, your migrations could end up.
57
+
58
+ There is also not any built in support for creating views in Rails, which means you would probably end
59
+ up writing database specific SQL, which could potentially become a problem along the way.
60
+
61
+ Migrations is just not a natural place for views. Just let listable handle it for you instead...
62
+
63
+ === Using your listable models
64
+ You can query your view backed model like any other model:
65
+ class ListItemsController < ApplicationController
66
+ def index
67
+ @items = ListItem.order("name")
68
+ end
69
+ end
70
+
71
+ The original model is accessible through the "listable" property.
72
+
73
+ # index.html.erb
74
+ render @items
75
+
76
+ # _list_item.html.erb
77
+ content_tag :h1, list_item.name
78
+ link_to list_item.listable # Links to the original model
9
79
 
10
80
  == Contributing to listable
11
81
 
data/Rakefile CHANGED
@@ -17,7 +17,7 @@ Jeweler::Tasks.new do |gem|
17
17
  gem.name = "listable"
18
18
  gem.homepage = "http://github.com/baldursson/listable"
19
19
  gem.license = "MIT"
20
- gem.summary = %Q{Rails extension that makes it easy to list and query several models through a single view backed model.}
20
+ gem.summary = %Q{ActiveRecord extension that makes it easy to list and query several models through a single view backed model.}
21
21
  gem.description = %Q{With listable you can consolidate fields from several models into one, backed up by a database view.
22
22
  It is perfect for e.g. a front page where you may want to display the most recent additions to your site in a joint list.
23
23
  By providing scopes for each model you wish to include in a view, Listable will automatically create the database view for you.}
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.1.5
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "listable"
8
- s.version = "0.1.4"
8
+ s.version = "0.1.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Johannes Baldursson"]
@@ -41,7 +41,7 @@ Gem::Specification.new do |s|
41
41
  s.licenses = ["MIT"]
42
42
  s.require_paths = ["lib"]
43
43
  s.rubygems_version = "1.8.19"
44
- s.summary = "Rails extension that makes it easy to list and query several models through a single view backed model."
44
+ s.summary = "ActiveRecord extension that makes it easy to list and query several models through a single view backed model."
45
45
 
46
46
  if s.respond_to? :specification_version then
47
47
  s.specification_version = 3
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: listable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -234,7 +234,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
234
234
  version: '0'
235
235
  segments:
236
236
  - 0
237
- hash: 1761110371856318284
237
+ hash: -4561906636969881367
238
238
  required_rubygems_version: !ruby/object:Gem::Requirement
239
239
  none: false
240
240
  requirements:
@@ -246,6 +246,6 @@ rubyforge_project:
246
246
  rubygems_version: 1.8.19
247
247
  signing_key:
248
248
  specification_version: 3
249
- summary: Rails extension that makes it easy to list and query several models through
250
- a single view backed model.
249
+ summary: ActiveRecord extension that makes it easy to list and query several models
250
+ through a single view backed model.
251
251
  test_files: []