Mark Reginald James wrote:
> Nate wrote:
> 
>> 
>>    class Revision < ActiveRecord::Base
>>         belongs_to :environment
>>         belongs_to :source_revision,
>>              :class_name => 'Revision',
>>              :foreign_key => 'source_revision_id'
>>    end
> 
> In your Revision model are you making any assignments to an @environment
> instance variable, or have you defined an "environment" attr_accessor?
> If so, rename to avoid conflict with the belongs_to.
> 
> --
> We develop, watch us RoR, in numbers too big to ignore.

Is there a way to do this and have it use the association? I need to 
override the assoc= method of a model to make sure the assignment 
matches some predefined criteria. However, if I try to assign via 
@assoc= I get the error message about an undefined target, and if I use 
self.assoc= I wind up in an endless recursion until a stack overflow 
occurs.

class Project < ActiveRecord::Base
  belongs_to :status, :class_name => "ProjectStatus",
    :foreign_key => 'status_code'

  # Updates the current project's status unless the current
  # status is greater than the new status. Status' are compared
  # using ProjectStatus::compare_status method The
  # new_project_status argument should be a ProjectStatus record
  # (i.e. ProjectStatus::SOME_STATUS)
  def status= (new_project_status, override = false)
    puts "Current status = [EMAIL PROTECTED]" #Debugging
    if override or @status < new_project_status
      puts "New status = #{new_project_status}" #Debugging
      @status = new_project_status
    else
      puts "No change in status" #Debugging
    end
  end
end

class ProjectStatus < ActiveRecord::Base
  has_many :project, :foreign_key => "status_code"

  def > (status); compare_status(status, ">"); end
  def >= (status); compare_status(status, ">="); end
  def < (status); compare_status(status, "<"); end
  def <= (status); compare_status(status, "<="); end

  def self.find_by_code (code)
    ProjectStatus.find(:first, :conditions => ['code = ?', code])
  end

  def to_s; self.status; end
  def to_i; self.id; end

  # Setup some shortcuts i.e. ProjectStatus::SOME_STATUS
  # will return the status record for that code
  def self.const_missing(sym)
    if s = ProjectStatus.find_by_code(sym.to_s)
      s
    else
      super
    end
  end

private

  def compare_status (status, op)
    eval self.order.to_s + op + status.order.to_s
  end
end
-- 
Posted via http://www.ruby-forum.com/.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to