gpt4 book ai didi

ruby-on-rails - 多个字段的单个虚拟属性定义

转载 作者:太空宇宙 更新时间:2023-11-03 16:51:03 25 4
gpt4 key购买 nike

我想知道是否有办法设置虚拟属性,以便它可以处理多个字段/变量。

基本上,我的模型中有几个不同的整数列(收入、税收),对于每个列,我都需要检查提交表单的时间,并删除非法字符,我通过设置虚拟属性和使用 tr 去除字符。

def flexible_income
income
end

def flexible_income=(income)
self.income = income.tr('$ ,', '') unless income.blank?
end

然后我在 Controller 中设置强参数,这是应该做的:

params.required(:tax).permit(:flexible_income, :flexible_taxes)

问题是我有很多字段(不仅仅是我上面列出的两个),所以对于这些字段中的每一个,(其中许多只需要检查完全相同的非法字符)我必须使用一个新的虚拟属性,基本上只是重复相同的代码:

def flexible_taxes
taxes
end

def flexible_taxes=(taxes)
self.taxes = taxes.tr('$ ,', '') unless taxes.blank?
end

有没有办法只为许多不同的字段设置一个共同的共享属性,同时仍然能够设置强参数?

最佳答案

您始终可以使用元编程来动态生成所有这些重复代码。

module Flexible
FLEXIBLE_ATTRIBUTES.each do |attr|
define_method("flexible_#{attr}") do
self.send(attr)
end

define_method("flexible_#{attr}=") do |val|
self.send("#{attr}=", val.tr('$ ,', '')) unless val.blank?
end

end
end

现在在你的类中包含这个模块并定义FLEXIBLE_ATTRIBUTES:

class MyModel
FLEXIBLE_ATTRIBUTES = [:income, :taxes] #......
include Flexible
end

现在我还没有测试这段代码,但它应该以最少的重复性完成您正在寻找的事情。它还将 Flexible 方法创建逻辑与模型本身分开。如果需要,它还允许您在其他类中重用此模块。

关于ruby-on-rails - 多个字段的单个虚拟属性定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21820599/

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