gpt4 book ai didi

ruby-on-rails - 根据虚拟属性设置事件记录属性

转载 作者:行者123 更新时间:2023-12-04 03:50:15 24 4
gpt4 key购买 nike

我有一个名为 dimensions 的属性,我想根据我的 widthheightdepth 进行设置> 属性。

例如,我想做 ShippingProfile.find(1).width = 4,并将其保存为 {:width => 4, :height => 0, :depth => 0}`

这可能吗?

class ShippingProfile < ActiveRecord::Base
after_initialize :set_default_dimensions

serialize :dimensions, Hash

attr_accessor :width, :height, :depth
attr_accessible :width, :height, :depth, :dimensions

private

def set_default_dimensions
self.dimensions ||= {:width => 0, :height => 0, :depth => 0}
end
end

最佳答案

非常好,您需要做的就是使用回调来设置 self.dimensions 的值:

class ShippingProfile < ActiveRecord::Base
after_initialize :set_default_dimensions
after_validation :set_dimensions

serialize :dimensions, Hash

attr_accessor :width, :height, :depth
attr_accessible :width, :height, :depth, :dimensions

private

def set_default_dimensions
self.dimensions ||= {:width => 0, :height => 0, :depth => 0}
end

def set_dimensions
self.dimensions = {
:width => self.width || self.dimensions[:width],
:height => self.height || self.dimensions[:height],
:depth => self.depth || self.dimensions[:depth],
}
end
end

你需要使用self.foo || self.dimensions[:foo] 以确保您保留已在散列中设置的任何现有值。为什么?您的维度属性(我假设)没有保存在数据库中 - 您使用的是 attr_accessor,而不是将它们设置为表中的字段。

顺便说一句,我认为您的模型设计方式有误。通过将维度作为哈希存储在数据库中,您不仅失去了基于这些属性进行查询的能力,而且还增加了不需要的脆弱性级别。

如果您将各个维度属性存储为单独的字段,那么您就会引入冗余和复杂性。将这三个属性作为数据库中的字段(如果您还没有),然后在需要时动态生成维度散列,您会得到更好的服务:

class ShippingProfile < ActiveRecord::Base
def dimensions
{ :width => self.width, :height => self.height, :depth => self.depth }
end
end

这样,您可以保留功能并获得一些灵 active 。

关于ruby-on-rails - 根据虚拟属性设置事件记录属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com