1

我有一个模型 - 会议。在数据库模式中 - 会议有任务。(任务也有模型)当我保存会议时,会议模型中有一个自动调用的方法。它是这样写的:

def task_attributes=(task_attributes)

它是如何被调用的?我检查了。该方法没有写在代码的其他任何地方。

4

2 回答 2

0

如果开会has_one :task而你有accepts_nested_attributes_for :task,这意味着调用fields_for :task将生成遵循格式的参数,<association_name>_attributes这可能是你在代码中的任何地方都找不到它的原因。

于 2013-02-07T12:38:18.873 回答
0

由于您使用的是has_many关联,ActiveRecord因此在您的案例任务中保存子模型。如果您正在生成新任务,无论您是否设置:autosave为 true,都会发生这种情况。Ruby 在幕后动态生成所有代码,这就是您找不到它的原因。

一对多示例

当 :autosave 未声明时,在保存其父级时保存新子级:

class Meeting
  has_many :comments # :autosave option is not declared
end

meeting = Meeting.new(title: 'staff')
meeting.tasks.build(name: 'boring stuff')
meeting.save # => saves both meeting and task

meeting = Meeting.create(title: 'staff')
meeting.tasks.build(name: 'boring stuff')
meeting.save # => saves both meeting and task

meeting = Meeting.create(title: 'staff')
meeting.tasks.create(name: 'boring stuff')
meeting.save # => saves both meeting and task

当 :autosave 为真时,所有子项都会被保存,无论它们是否是新记录:

class Meeting
  has_many :tasks , autosave: true
end

meeting = Meeting.create(title: 'staff')
meeting.tasks.create(name: 'boring stuff')
meeting.tasks[0].priority = 1
meeting.save # => saves both meeting and task, with 1 as priority
于 2013-02-07T15:52:30.320 回答