[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_attribute
and 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"