2013-05-11 4 views
0

я определила несколько виртуальных атрибутов, определяющих как сеттер и методы геттеры:Определение виртуального атрибута в Rails и сделать его доступным как символ

class Post < ActiveRecord::Base 

    def shared_to_all 
    # evaluates some expression of the attribute privacy 
    end 

    def shared_to_friends 
    # evaluates some other expression of the attribute privacy 
    end 

    def shared_to_all=(bool) 
    # write_attribute(:privacy, ...) 
    end 

    def shared_to_friends=(bool) 
    # write_attribute(:privacy, ...) 
    end 

end 

до сих пор так хорошо, но я хочу Кроме того, чтобы сделать это виртуальные атрибуты доступны с помощью символов, так что я могу сделать что-то вроде @post= Post.first; @post[:shared_to_all]= true

[Edit:]
рубинового подход был бы переопределить [] и []= операторов, как в:

def [](shared_to_all) 
    shared_to_all 
end 

def []=(shared_to_all, bool) 
    self.shared_to_all= (bool) 
end 

Но это, кажется, разорвать методы отношений Rails (привезенные на has_one - has_many - belongs_to - has_and_belongs_to_many директивы): например, Теперь Post.first.author => nil и Author.first.posts => []

+0

Почему не использовать 'attr_accessible'? Какая ошибка вы получаете? – hrr

ответ

0

Кажется, это должно сделать это:

def [](attr) 
    attr 
end 
def []=(attr, value) 
    self.attr = value 
end 
+0

Переопределения '[]' и '[] =' операторов, похоже, нарушают методы отношений (доступные через has_one - has_many - принадлежат_to - has_and_belongs_to_many директивы): например. теперь 'Post.first.author => nil'' Author.first.posts => [] ' –

+0

Это интересно, интересно, где это определено ... – cpuguy83