Override ActiveRecord attribute methods

前端 未结 4 1863
臣服心动
臣服心动 2020-12-07 07:39

An example of what I\'m talking about:

class Person < ActiveRecord::Base
  def name=(name)
    super(name.capitalize)
  end
  def name
    super().downcas         


        
相关标签:
4条回答
  • 2020-12-07 08:18

    Echoing Gareth's comments... your code will not work as written. It should be rewritten this way:

    def name=(name)
      write_attribute(:name, name.capitalize)
    end
    
    def name
      read_attribute(:name).downcase  # No test for nil?
    end
    
    0 讨论(0)
  • 2020-12-07 08:26

    I have a rails plugin that makes attribute overriding work with super as you would expect. You can find it on github.

    To install:

    ./script/plugin install git://github.com/chriseppstein/has_overrides.git
    

    To use:

    class Post < ActiveRecord::Base
    
      has_overrides
    
      module Overrides
        # put your getter and setter overrides in this module.
        def title=(t)
          super(t.titleize)
        end
      end
    end
    

    Once you've done that things just work:

    $ ./script/console 
    Loading development environment (Rails 2.3.2)
    >> post = Post.new(:title => "a simple title")
    => #<Post id: nil, title: "A Simple Title", body: nil, created_at: nil, updated_at: nil>
    >> post.title = "another simple title"
    => "another simple title"
    >> post.title
    => "Another Simple Title"
    >> post.update_attributes(:title => "updated title")
    => true
    >> post.title
    => "Updated Title"
    >> post.update_attribute(:title, "singly updated title")
    => true
    >> post.title
    => "Singly Updated Title"
    
    0 讨论(0)
  • 2020-12-07 08:27

    As an extension to Aaron Longwell's answer, you can also use a "hash notation" to access attributes that have overridden accessors and mutators:

    def name=(name)
      self[:name] = name.capitalize
    end
    
    def name
      self[:name].downcase
    end
    
    0 讨论(0)
  • 2020-12-07 08:36

    There is some great information available on this topic at http://errtheblog.com/posts/18-accessor-missing.

    The long and short of it is that ActiveRecord does correctly handle super calls for ActiveRecord attribute accessors.

    0 讨论(0)
提交回复
热议问题