gpt4 book ai didi

ruby-on-rails - 定义动态类方法

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

我知道这个问题已经被问过好几次了,但我认为从来没有出现过这种情况。

我尝试为我的模型创建一个“助手”(acts_as),用于从 status_id 自动设置状态。

acts_as_statusable :status, [ :in_progress, closed ]

此助手创建方法 statusstatus=(sym)in_progress?closed? 并命名为范围 in_progressclosed

我的 helper ,这是它的代码放在lib/

class ActiveRecord::Base
def self.acts_as_statusable(*args)
field_name = args.first
field_name_id = :"#{field_name}_id"
statuses = args.second

# Define getter
define_method(field_name) do
return nil if self.send(field_name_id).nil?
return statuses[self.send(field_name_id)]
end

# Define setter
define_method(:"#{field_name}=") do |v|
return self.send(:"#{field_name_id}=", statuses.index(v))
end

# Define a status? for each status,
# and a named scope .status
statuses.each do |status|
define_method(:"#{status}?") do
return self.send(field_name) == status
end
scope status, -> { where(["#{table_name}.#{field_name_id} = ?", statuses.index(status)]) }
end

validates field_name_id, :inclusion => { :in => (0...statuses.length).to_a }
end
end

现在,问题

我需要一个类方法,用于每个使用 acts_as_statusable 的类,名为 status_index(sym),它从状态返回 status_id。

问题是我找到的用于定义类模型的每个解决方案都使用 Moduleextendintend,但我无法插入acts_as_statusable 行的 statuses 变量进入此模块...

我该怎么做?我使用 Rails 4。

最佳答案

您可以使用 class_evalclass_variable_set

class_variable_set :"@@#{field_name}_options", statuses

class_eval <<-RUBY
def self.status_index(sym)
@@#{field_name}_options.index(sym)
end
RUBY

在你的情况下会给出一个

@@status_options 类变量
和一个
status_index(sym)
返回给定状态的偏移量的方法

关于ruby-on-rails - 定义动态类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22267199/

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