0

У меня есть модифицированная версия prototypical polymorphic modelПолиморфные ассоциации по умолчанию не работают?

class Picture < ActiveRecord::Base 
    belongs_to :imageable, polymorphic: true 

    before_save :default_value 

    private 

    def default_value 
    Rails.logger.debug("*** Setting default value ***") 
    # Set default values here 
    end 
end 

class Employee < ActiveRecord::Base 
    has_many :pictures, as: :imageable 
end 

class Product < ActiveRecord::Base 
    has_many :pictures, as: :imageable 
end 

Здесь я попытался установить значения по умолчанию для Picture модели, так как suggested in an answer to a similar question.

Проблема заключается в том, что метод default_value не вызывается, когда Employee или Product сохраняется.

Я могу подтвердить, что дб настроен правильно, потому что я побежал это в рельсах консоли:

emp = Employee.create() # Creating Employee.id == 1 
emp.pictures.count # == 0 
Picture.create(imageable_id: 1, imageable_type: "Employee") # Here, setting defaults works fine 
Employee.find(1).pictures.count # == 1 

Так что вопрос: почему не default_value дозвонились, когда я сохранить Employee или Product ?

+0

Что вы подразумеваете под "сохранить «Сотрудник» или «Продукт»? Исходя из вашего примера, я не вижу причин, по которым эти два класса наследуют методы из «Picture». Что вы хотите сделать? – ptd

+0

Спасибо за ваш комментарий ptd! Меня просто озарило, что я надеюсь, что эта установка должна вести себя скорее как «наследование», но, как я написал в комментарии к принятому ответу, теперь я понимаю, почему он не может делать то, что я этого хотел. – conciliator

ответ

1

Обратные вызовы работают одинаково с console или server. Этот обратный вызов запускается только в том случае, если объект сохраняется.

Если вы сохраните Employee, это изменит значение дочернего элемента при сохранении, только если в дочернем элементе будет изменен какой-либо атрибут. Пример:

emp = Employee.first 
emp.pictures.first.foo = "bar" # assuming that you have a column foo in pictures table 
emp.save # will save the picture and trigger the callback `before_save` 

Но если у вас есть следующий сценарий, то изображения не будут сохранены:

emp = Employee.first 
emp.save # will save only emp 

Если вам нужно сохранить все фотографии, по какой-то причине, вы можете сделать следующее:

class Employee < ActiveRecord::Base 
    has_many :pictures, as: :imageable 
    before_save :default_value 

    def default_value 
    self.pictures.update_all(foo: "bar") 
    end 
end 
+0

Спасибо mohameddiaa27. Я понял, что надеялся, что «Сотрудник» и «Продукт» наследуют »(в поведенческом смысле)' Picture 'методы, но это не может работать. Что произойдет, если вы сохраните «Сотрудник» несколько раз? Должна ли она создавать новую запись в 'Picture' для каждого сохранения? Поведение, как оно есть, имеет смысл для меня. Спасибо за ваши усилия! :) – conciliator

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