2012-03-31 3 views
2

У меня есть модели HABTM Client и Book. Модель Client имеет атрибут bookshelf_color, чтобы указать, есть ли у клиента полный набор книг, часть из них или ни одна из них. Как только книги на книжной полке меняются, обратный вызов set_bookshelf_color должен отражать изменение.Назначение атрибутов в обратном вызове не работает?

Вопрос в том, почему у меня есть префикс назначения bookshelf_color в частном обратном вызове ниже с "self.", чтобы заставить его работать (как это не иначе)?

class Client < ActiveRecord::Base 

    has_and_belongs_to_many :books, autosave: true, uniq: true, 
    after_add: :set_bookshelf_color, after_remove: :set_bookshelf_color 

    attr_accessible :id, :book_ids, :bookshelf_color 

    private 

    def set_bookshelf_color(book) 
     if Book.pluck(:abbr).map{|b| books.map(&:abbr).map(&:to_s).include?(b.to_s)}.all? 
     self.bookshelf_color = "green" 
     elsif Book.pluck(:abbr).map{|b| books.map(&:abbr).map(&:to_s).include?(b.to_s)}.any? 
     self.bookshelf_color = "yellow" 
     else 
     self.bookshelf_color = "red" 
     end 
    end 
    # /private 
end 

ответ

1

Помните, что ваши свойства модели являются только переменные экземпляра за кадром - все, что мы делаем, когда мы взаимодействуем с ними вызова методов получения и установки, настроенные attr_accessor. Когда мы пишем instance.bookshelf_color = "red", мы отправляем метод bookshelf_color= с аргументом "red", на приемник, instance.

Прохладный. Что происходит, когда мы пишем только bookshelf_color = "red"?

В Ruby назначение простого слова используется для определения локальных переменных. Помещение name = "value" в определение метода определит name в локальной области, а не вызывает метод name= на self, даже если этот метод существует.

class Foo 
    attr_accessor :bar 

    def set_bar(val) 
    bar = val 
    end 
end 

f = Foo.new 
f.set_bar "baz" 
f.bar # still nil 

Если я указан явный приемник, self.bar = val, Ruby знал бы я хотел послать self метод bar=, который бы имел желаемый результат.

Есть несколько хороших дальнейших чтений о радостях self, и почему вы должны использовать его, на Joe Yates' Blog.

+0

Спасибо, это объясняет - сначала это выглядело странно. –

Смежные вопросы