diff options
| author | hukl <hukl@eight.local> | 2009-02-02 00:22:54 +0100 |
|---|---|---|
| committer | hukl <hukl@eight.local> | 2009-02-02 00:22:54 +0100 |
| commit | 7a5555b1ac542e5fd5680cefaba3574677ecaa46 (patch) | |
| tree | a501453333e52b25041380cd9349898d0e0d647e | |
| parent | c1854b8b518bde82b80429636f73496a537c3ad5 (diff) | |
aggregation spike with flags associated to pages
Page has now a named_scope :with_flags which
accepts an array of flag names and returns
corresponding pages. Can be chained with order and
limit
| -rw-r--r-- | app/models/flag.rb | 3 | ||||
| -rw-r--r-- | app/models/page.rb | 22 | ||||
| -rw-r--r-- | db/migrate/20090201211159_create_flags.rb | 13 | ||||
| -rw-r--r-- | db/migrate/20090201211523_add_join_table_for_flags_pages.rb | 15 | ||||
| -rw-r--r-- | test/fixtures/flags.yml | 7 | ||||
| -rw-r--r-- | test/unit/flag_test.rb | 8 |
6 files changed, 57 insertions, 11 deletions
diff --git a/app/models/flag.rb b/app/models/flag.rb new file mode 100644 index 0000000..6d67377 --- /dev/null +++ b/app/models/flag.rb | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | class Flag < ActiveRecord::Base | ||
| 2 | has_and_belongs_to_many :pages | ||
| 3 | end | ||
diff --git a/app/models/page.rb b/app/models/page.rb index 3d02e9f..d5d888f 100644 --- a/app/models/page.rb +++ b/app/models/page.rb | |||
| @@ -1,9 +1,19 @@ | |||
| 1 | class Page < ActiveRecord::Base | 1 | class Page < ActiveRecord::Base |
| 2 | 2 | ||
| 3 | belongs_to :node | 3 | belongs_to :node |
| 4 | has_and_belongs_to_many :flags | ||
| 4 | 5 | ||
| 5 | acts_as_list :column => :revision, :scope => :node_id | 6 | acts_as_list :column => :revision, :scope => :node_id |
| 6 | 7 | ||
| 8 | named_scope :with_flags, lambda {|flag_names| | ||
| 9 | if (flags = Flag.find_all_by_name(flag_names)).empty? | ||
| 10 | {} | ||
| 11 | else | ||
| 12 | {:include => :flags, :conditions => ['flags_pages.flag_id IN (?)', flags.map(&:id)] } | ||
| 13 | end | ||
| 14 | } | ||
| 15 | |||
| 16 | |||
| 7 | 17 | ||
| 8 | # <aggregate | 18 | # <aggregate |
| 9 | # flags="updates pressemitteilungen" | 19 | # flags="updates pressemitteilungen" |
| @@ -29,14 +39,4 @@ class Page < ActiveRecord::Base | |||
| 29 | :order => "#{options[:order_by]} #{options[:order_direction]}" | 39 | :order => "#{options[:order_by]} #{options[:order_direction]}" |
| 30 | ) | 40 | ) |
| 31 | end | 41 | end |
| 32 | end | 42 | end \ No newline at end of file |
| 33 | |||
| 34 | |||
| 35 | named_scope :flagged_as, lambda { |flags| | ||
| 36 | conditions = {} | ||
| 37 | flags.each do |flag| | ||
| 38 | conditions[flag] = true | ||
| 39 | end | ||
| 40 | |||
| 41 | { :conditions => conditions } | ||
| 42 | } \ No newline at end of file | ||
diff --git a/db/migrate/20090201211159_create_flags.rb b/db/migrate/20090201211159_create_flags.rb new file mode 100644 index 0000000..3b9da43 --- /dev/null +++ b/db/migrate/20090201211159_create_flags.rb | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | class CreateFlags < ActiveRecord::Migration | ||
| 2 | def self.up | ||
| 3 | create_table :flags do |t| | ||
| 4 | t.string :name | ||
| 5 | |||
| 6 | t.timestamps | ||
| 7 | end | ||
| 8 | end | ||
| 9 | |||
| 10 | def self.down | ||
| 11 | drop_table :flags | ||
| 12 | end | ||
| 13 | end | ||
diff --git a/db/migrate/20090201211523_add_join_table_for_flags_pages.rb b/db/migrate/20090201211523_add_join_table_for_flags_pages.rb new file mode 100644 index 0000000..99eb9c9 --- /dev/null +++ b/db/migrate/20090201211523_add_join_table_for_flags_pages.rb | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | class AddJoinTableForFlagsPages < ActiveRecord::Migration | ||
| 2 | def self.up | ||
| 3 | create_table :flags_pages, :id => false do |t| | ||
| 4 | t.integer :flag_id | ||
| 5 | t.integer :page_id | ||
| 6 | end | ||
| 7 | add_index :flags_pages, [:flag_id] | ||
| 8 | add_index :flags_pages, [:page_id] | ||
| 9 | end | ||
| 10 | |||
| 11 | def self.down | ||
| 12 | remove_table :flags_pages | ||
| 13 | end | ||
| 14 | |||
| 15 | end | ||
diff --git a/test/fixtures/flags.yml b/test/fixtures/flags.yml new file mode 100644 index 0000000..157d747 --- /dev/null +++ b/test/fixtures/flags.yml | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html | ||
| 2 | |||
| 3 | one: | ||
| 4 | name: MyString | ||
| 5 | |||
| 6 | two: | ||
| 7 | name: MyString | ||
diff --git a/test/unit/flag_test.rb b/test/unit/flag_test.rb new file mode 100644 index 0000000..49b0d96 --- /dev/null +++ b/test/unit/flag_test.rb | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | require 'test_helper' | ||
| 2 | |||
| 3 | class FlagTest < ActiveSupport::TestCase | ||
| 4 | # Replace this with your real tests. | ||
| 5 | test "the truth" do | ||
| 6 | assert true | ||
| 7 | end | ||
| 8 | end | ||
