[ruby-on-rails] ActiveRecord 속성 메소드 대체

내가 말하는 것에 대한 예 :

class Person < ActiveRecord::Base
  def name=(name)
    super(name.capitalize)
  end
  def name
    super().downcase  # not sure why you'd do this; this is just an example
  end
end

이것은 작동하는 것처럼 보이지만 ActiveRecord :: Base docs 에서 속성 메소드를 재정의하는 섹션을 읽었 으며 read_attributeand write_attribute메소드를 사용하는 것이 좋습니다 . 위의 예에서 내가하고있는 일에 문제가 있다고 생각했습니다. 그렇지 않으면 왜 속성 메소드를 재정의하는 “올바른 방법”으로 이러한 메소드를 축복합니까? 그들은 또한 더 못생긴 관용구를 강요하고 있기 때문에 좋은 이유가 있어야합니다 …

내 진짜 질문 :이 예제에 문제가 있습니까?



답변

Gareth의 의견을 반향 … 귀하의 코드는 작성된대로 작동하지 않습니다. 다음과 같이 다시 작성해야합니다.

def name=(name)
  write_attribute(:name, name.capitalize)
end

def name
  read_attribute(:name).downcase  # No test for nil?
end


답변

Aaron Longwell의 답변에 대한 확장으로 “해시 표기법”을 사용하여 재정의 된 접근 자와 뮤 테이터가있는 속성에 액세스 할 수도 있습니다.

def name=(name)
  self[:name] = name.capitalize
end

def name
  self[:name].downcase
end


답변

이 주제에 대한 유용한 정보는 http://errtheblog.com/posts/18-accessor-missing에 있습니다.

길고 짧은 것은 ActiveRecord가 ActiveRecord 속성 접근자를위한 수퍼 호출을 올바르게 처리한다는 것입니다.


답변

속성 오버라이드가 super와 함께 작동하도록하는 레일 플러그인이 있습니다. github에서 찾을 수 있습니다 .

설치하기 위해서:

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

쓰다:

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

일단 당신이 그 일을 작동하면 :

$ ./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"


답변