在 Rails 中,如何向属性/列添加“helper”方法?[关闭]

In Rails how I add a "helper" method to an attribute / column? [closed]

提问人:CafeHey 提问时间:11/16/2023 更新时间:11/16/2023 访问量:100

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

3天前关闭。

截至 2 天前,社区正在审查是否重新打开此问题。

假设我们有一个名为“Items”的表,一个名为“name”的列和一个名为“quantity”的列。

然后假设我们有一个这样的项目实例:

@item = Item.first

在此实例上,您可以调用方法,例如:

@item.name.present?
@item.quantity.is_a?(Integer)

我将如何将自己的方法添加到所有列中,例如,如果我想调用:

@item.name.custom_method?
@item.quantity.custom_method?
@item.name.custom_method_2(:xyz)
@item.quantity.custom_method_2(:xyz)

因此,我想将方法添加到所有列属性中,每个属性都用它做一个自定义的事情。我已经看到了它的一些宝石,例如,Rails 用 dirty 来做它并添加到列/属性中。changed?

Ruby-on-Rails Ruby ActiveRecord

评论

5赞 engineersmnky 11/16/2023
这些不是列的“自定义方法”。它们是在返回值上实现的方法。例如:likely 返回 a 并为类实现。如果你想向 ALL Objects 添加一个方法,你可以将其添加到类中(但请不要这样做)。 不添加作为返回值的方法(因为这是不可能的),而是通过元编程定义一个新方法。如果这是您感兴趣的,请澄清用例,也许我们可以提供帮助。@item.nameStringpresent?StringObjectActiveRecord::Dirtychanged?XXXX_changed?
0赞 CafeHey 11/16/2023
啊,我明白了,谢谢你的解释。我误以为铁轨很脏。下面的答案非常有帮助,我想我正在寻找什么,所以我要把它标记为答案。

答:

4赞 Alex 11/16/2023 #1

您可以定义所谓的属性方法,而属性方法又会为所有属性定义方法

# app/models/model.rb

class Model < ApplicationRecord
  attribute_method_suffix "_is_custom?"

  private

  def attribute_is_custom? attr
    "#{attr} is custom."
  end
end
>> Model.first.name_is_custom?
=> "name is custom."
>> Model.first.id_is_custom?
=> "id is custom."

https://api.rubyonrails.org/classes/ActiveModel/AttributeMethods.html