Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将一个/多个关联标记为肮脏?_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 如何将一个/多个关联标记为肮脏?

Ruby on rails 如何将一个/多个关联标记为肮脏?,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我一直在AR中寻找这种功能,但似乎找不到。AR的Dirty实现声明,只有当已经持久化的实例的一个直接属性发生更改时,才会将其视为Dirty。那么,让我们说: class Picture < ActiveRecord::Base belongs_to :gallery has_one :frame end 但是现在我不能为has_one关联做类似的事情,因为Picture实现没有引用它的属性。所以,这样肮脏的加价似乎是不可能的。或者他们不是吗?我能想出的最好办法是: class P

我一直在AR中寻找这种功能,但似乎找不到。AR的Dirty实现声明,只有当已经持久化的实例的一个直接属性发生更改时,才会将其视为Dirty。那么,让我们说:

class Picture < ActiveRecord::Base
  belongs_to :gallery
  has_one :frame
end

但是现在我不能为has_one关联做类似的事情,因为Picture实现没有引用它的属性。所以,这样肮脏的加价似乎是不可能的。或者他们不是吗?

我能想出的最好办法是:

class Picture < ActiveRecord::Base
  belongs_to :gallery
  has_one :frame

  after_save :force_save_frame

  def force_save_frame
    frame.save! if frame.changed?
  end
end
类图片
如前所述,脏标志是为模型本身的属性设置的,而不是为相关对象设置的。它仅适用于所属的,因为模型上有外键

但是你可以做这样的把戏

module FrameDirtyStateTracking
  def frame=(frame)
    attribute_will_change!('frame')
    super
  end
end

class Picture < ActiveRecord::Base
  prepend FrameDirtyStateTracking

  belongs_to :gallery
  has_one :frame
end

picture = Picture.new
picture.frame = Frame.new
picture.changed? # => true
picture.changed # => ['frame']
模块FrameDirtyStateTracking
def帧=(帧)
属性将改变!(“框架”)
超级的
结束
结束
类图片真的
picture.changed#=>['frame']

脏标志是为模型本身的属性设置的,而不是为相关对象设置的。它只适用于
所属的
,因为模型上有外键。是的,我知道你能做什么。我只是想问,既然有这样的要求,你为什么不能“肮脏”其他协会呢。很明显,它已经存在的是一个很好的默认值,但是如果要保存关联(不属于),那么除了显式保存关联之外,没有其他选择。您是否理解,一个属于意味着表上有一列可以设置为dirty?其他关系在表上没有列,而是在其他表上。是的,我理解,这就是我所说的“是的,我知道你能做什么”!因此,我要重复一次:将关联(而不是列)标记为dirty不是很好,这样业务逻辑在将模型持久化到数据库中时就可以考虑到这一点吗?您所说的是DB列被标记为dirty,但此逻辑属于模型。我知道当前的实现只将模型的特定属性(外键也是,因此属于)标记为肮脏,我只是想问,扩展这一点是否是一个好主意。这有什么缺点或可能出错的地方吗?我不这么认为@ted,但显然很难找出所有案例,主要是边缘案例。
module FrameDirtyStateTracking
  def frame=(frame)
    attribute_will_change!('frame')
    super
  end
end

class Picture < ActiveRecord::Base
  prepend FrameDirtyStateTracking

  belongs_to :gallery
  has_one :frame
end

picture = Picture.new
picture.frame = Frame.new
picture.changed? # => true
picture.changed # => ['frame']