v.custom_field.is_required = false
errors.add(:default_value, :activerecord_error_invalid) unless v.valid?
end
+
+ # Returns a ORDER BY clause that can used to sort customized
+ # objects by their value of the custom field.
+ # Returns false, if the custom field can not be used for sorting.
+ def order_statement
+ case field_format
+ when 'string', 'list', 'date', 'bool'
+ # COALESCE is here to make sure that blank and NULL values are sorted equally
+ "COALESCE((SELECT cv_sort.value FROM #{CustomValue.table_name} cv_sort" +
+ " WHERE cv_sort.customized_type='#{self.class.customized_class.name}'" +
+ " AND cv_sort.customized_id=#{self.class.customized_class.table_name}.id" +
+ " AND cv_sort.custom_field_id=#{id} LIMIT 1), '')"
+ else
+ nil
+ end
+ end
def <=>(field)
position <=> field.position
end
+ def self.customized_class
+ self.name =~ /^(.+)CustomField$/
+ begin; $1.constantize; rescue nil; end
+ end
+
# to move in project_custom_field
def self.for_all
find(:all, :conditions => ["is_for_all=?", true], :order => 'position')
assert q.has_column?(c)
end
+ def test_sort_by_string_custom_field_asc
+ q = Query.new
+ c = q.available_columns.find {|col| col.is_a?(QueryCustomFieldColumn) && col.custom_field.field_format == 'string' }
+ assert c
+ assert c.sortable
+ issues = Issue.find :all,
+ :include => [ :assigned_to, :status, :tracker, :project, :priority ],
+ :conditions => q.statement,
+ :order => "#{c.sortable} ASC"
+ values = issues.collect {|i| i.custom_value_for(c.custom_field).to_s}
+ assert_equal values.sort, values
+ end
+
+ def test_sort_by_string_custom_field_desc
+ q = Query.new
+ c = q.available_columns.find {|col| col.is_a?(QueryCustomFieldColumn) && col.custom_field.field_format == 'string' }
+ assert c
+ assert c.sortable
+ issues = Issue.find :all,
+ :include => [ :assigned_to, :status, :tracker, :project, :priority ],
+ :conditions => q.statement,
+ :order => "#{c.sortable} DESC"
+ values = issues.collect {|i| i.custom_value_for(c.custom_field).to_s}
+ assert_equal values.sort.reverse, values
+ end
+
def test_label_for
q = Query.new
assert_equal 'assigned_to', q.label_for('assigned_to_id')