chrislloyd-even_better_nested_set 0.3 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'date'
5
5
  require 'spec/rake/spectask'
6
6
 
7
7
  GEM = "even_better_nested_set"
8
- GEM_VERSION = "0.3"
8
+ GEM_VERSION = "0.3.1"
9
9
  AUTHOR = "Jonas Nicklas"
10
10
  EMAIL = "jonas.nicklas@gmail.com"
11
11
  HOMEPAGE = "http://github.com/jnicklas/even_better_nested_set/tree/master"
@@ -16,15 +16,17 @@ module EvenBetterNestedSet
16
16
  end
17
17
 
18
18
  module ClassMethods
19
-
19
+
20
+ attr_accessor :nested_set_options
21
+
20
22
  def find_last_root
21
23
  find(:first, :order => "#{nested_set_column(:right)} DESC", :conditions => { :parent_id => nil })
22
24
  end
23
25
 
24
26
  def find_boundaries(id)
25
27
  query = "SELECT #{nested_set_column(:left)}, #{nested_set_column(:right)}" +
26
- "FROM #{quote_db_label(table_name)}" +
27
- "WHERE #{quote_db_label(primary_key)} = #{id}"
28
+ "FROM #{quote_db_property(table_name)}" +
29
+ "WHERE #{quote_db_property(primary_key)} = #{id}"
28
30
  connection.select_rows(query).first
29
31
  end
30
32
 
@@ -55,15 +57,8 @@ module EvenBetterNestedSet
55
57
  return roots
56
58
  end
57
59
 
58
- def set_nested_set_columns(left,right)
59
- @nested_set_columns = {
60
- :left => quote_db_label(left||'lft'),
61
- :right => quote_db_label(right||'rgt')
62
- }
63
- end
64
-
65
60
  def nested_set_column(name)
66
- @nested_set_columns[name.to_sym]
61
+ quote_db_property(nested_set_options[name])
67
62
  end
68
63
 
69
64
  # Recalculates the left and right values for the entire tree
@@ -76,8 +71,8 @@ module EvenBetterNestedSet
76
71
  end
77
72
  end
78
73
 
79
- def quote_db_label(name)
80
- "`#{name}`".gsub('.','`.`')
74
+ def quote_db_property(property)
75
+ "`#{property}`".gsub('.','`.`')
81
76
  end
82
77
 
83
78
  end
@@ -132,7 +127,7 @@ module EvenBetterNestedSet
132
127
 
133
128
  transaction do
134
129
  reload_boundaries
135
- query = "SELECT id FROM #{self.class.quote_db_label(base_class.table_name)} " +
130
+ query = "SELECT id FROM #{self.class.quote_db_property(base_class.table_name)} " +
136
131
  "WHERE #{nested_set_column(:left)} >= #{left} AND #{nested_set_column(:right)} <= #{right} " +
137
132
  "ORDER BY #{nested_set_column(:left)}"
138
133
  @family_ids = base_class.connection.select_values(query).map(&:to_i)
@@ -173,11 +168,19 @@ module EvenBetterNestedSet
173
168
  @cached_children ||= []
174
169
  @cached_children.push(*nodes)
175
170
  end
176
-
171
+
172
+ def left
173
+ read_attribute(self.class.nested_set_options[:left])
174
+ end
175
+
177
176
  def left=(left) #:nodoc:
178
177
  raise EvenBetterNestedSet::IllegalAssignmentError, "left is an internal attribute used by EvenBetterNestedSet, do not assign it directly as is may corrupt the data in your database"
179
178
  end
180
179
 
180
+ def right
181
+ read_attribute(self.class.nested_set_options[:right])
182
+ end
183
+
181
184
  def right=(right) #:nodoc:
182
185
  raise EvenBetterNestedSet::IllegalAssignmentError, "right is an internal attribute used by EvenBetterNestedSet, do not assign it directly as is may corrupt the data in your database"
183
186
  end
@@ -195,8 +198,6 @@ module EvenBetterNestedSet
195
198
 
196
199
  protected
197
200
 
198
- attr_reader :nested_set_options
199
-
200
201
  def illegal_nesting
201
202
  if parent_id? and family_ids.include?(parent_id)
202
203
  errors.add(:parent_id, 'cannot move node to its own descendant')
@@ -268,8 +269,8 @@ module EvenBetterNestedSet
268
269
  end
269
270
 
270
271
  def set_boundaries(left, right)
271
- write_attribute(:left, left)
272
- write_attribute(:right, right)
272
+ write_attribute(self.class.nested_set_options[:left], left)
273
+ write_attribute(self.class.nested_set_options[:right], right)
273
274
  end
274
275
 
275
276
  def reload_boundaries
@@ -281,10 +282,10 @@ module EvenBetterNestedSet
281
282
  end
282
283
 
283
284
  def validate_parent_is_within_scope
284
- if nested_set_options[:scope] && parent_id
285
+ if self.class.nested_set_options[:scope] && parent_id
285
286
  parent.reload # Make sure we are testing the record corresponding to the parent_id
286
- if self.send(nested_set_options[:scope]) != parent.send(nested_set_options[:scope])
287
- errors.add(:parent_id, "cannot be a record with a different #{nested_set_options[:scope]} to this record")
287
+ if self.send(self.class.nested_set_options[:scope]) != parent.send(self.class.nested_set_options[:scope])
288
+ errors.add(:parent_id, "cannot be a record with a different #{self.class.nested_set_options[:scope]} to this record")
288
289
  end
289
290
  end
290
291
  end
@@ -293,12 +294,12 @@ module EvenBetterNestedSet
293
294
  module ClassMethods
294
295
 
295
296
  def acts_as_nested_set(options = {})
297
+ options = { :left => :left, :right => :right }.merge!(options)
296
298
  options[:scope] = "#{options[:scope]}_id" if options[:scope]
297
299
 
298
-
299
300
  include NestedSet
300
301
 
301
- set_nested_set_columns options[:left], options[:right]
302
+ self.nested_set_options = options
302
303
 
303
304
  named_scope :roots, :conditions => { :parent_id => nil }, :order => "#{nested_set_column(:left)} asc"
304
305
 
@@ -320,12 +321,6 @@ module EvenBetterNestedSet
320
321
  validate_on_update :illegal_nesting
321
322
  validate :validate_parent_is_within_scope
322
323
 
323
- class_eval do
324
- define_method :nested_set_options do
325
- options
326
- end
327
- end
328
-
329
324
  delegate :nested_set_column, :to => "self.class"
330
325
  end
331
326
 
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/spec_helper'
2
2
  require File.dirname(__FILE__) + '/nested_set_behavior'
3
3
 
4
4
  class Directory < ActiveRecord::Base
5
- acts_as_nested_set :left => 'left', :right => 'right'
5
+ acts_as_nested_set :left => :lft, :right => :rgt
6
6
 
7
7
  validates_presence_of :name
8
8
  end
@@ -24,4 +24,4 @@ describe Directory do
24
24
 
25
25
  it_should_behave_like "all nested set models"
26
26
 
27
- end
27
+ end
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/spec_helper'
2
2
  require File.dirname(__FILE__) + '/nested_set_behavior'
3
3
 
4
4
  class Employee < ActiveRecord::Base
5
- acts_as_nested_set :scope => :company, :left => 'left', :right => 'right'
5
+ acts_as_nested_set :scope => :company
6
6
 
7
7
  validates_presence_of :name
8
8
  end
data/spec/spec_helper.rb CHANGED
@@ -49,8 +49,8 @@ end
49
49
  class TestMigration < ActiveRecord::Migration
50
50
  def self.up
51
51
  create_table :directories, :force => true do |t|
52
- t.column :left, :integer
53
- t.column :right, :integer
52
+ t.column :lft, :integer
53
+ t.column :rgt, :integer
54
54
  t.column :parent_id, :integer
55
55
  t.column :name, :string
56
56
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chrislloyd-even_better_nested_set
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.3"
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Nicklas