gpt4 book ai didi

ruby-on-rails - 如何访问从实例方法传递给 acts_as 插件(ActiveRecord 装饰器)的选项?

转载 作者:数据小太阳 更新时间:2023-10-29 08:10:50 26 4
gpt4 key购买 nike

目前我将每个选项存储在其自己的类属性中,但是当我需要从实例方法访问传递的选项时,这会导致代码难以阅读。

例如,如果我将列名作为选项传递,我必须使用 self.send(self.class.path_finder_column) 从实例方法中获取列值。

请注意,我在类属性前加上我的插件名称以防止名称冲突。

这是一个简单的插件代码示例,它传递了一个选项 column,然后从实例方法 set_path 访问它。是否可以简化 getter/setter 以提高可读性?

# usage: path_find :column => 'path'

module PathFinder
def path_finder(options = {})
send :include, InstanceMethods

# Create class attributes for options
self.cattr_accessor :path_finder_column
self.path_finder_column = options[:column]

module InstanceMethods
def set_path
# setter
self.send(self.class.path_finder_column + '=', 'some value')
# getter
self.send(self.class.path_finder_column)
end
end
end
end

ActiveRecord::Base.send :extend, PathFinder

最佳答案

您可以在运行时生成所有这些方法。

module PathFinder
def path_finder(options = {})

# Create class attributes for options
self.cattr_accessor :path_finder_options
self.path_finder_options = options

class_eval <<-RUBY
def path_finder(value)
self.#{options[:column]} = value
end

def path_finder
self.#{options[:column]}
end
RUBY
end
end

ActiveRecord::Base.send :extend, PathFinder

除非你需要存储选项,否则你也可以删除行

self.cattr_accessor :path_finder_options
self.path_finder_options = options

请注意,只要您始终使用 path_finderpath_finder=,我的解决方案就不需要 setter 和 getter。所以,最短的解决方案是(假设只有 :column 选项,没有其他要求)

module PathFinder
def path_finder(options = {})

# here more logic
# ...

class_eval <<-RUBY
def path_finder(value)
self.#{options[:column]} = value
end

def path_finder
self.#{options[:column]}
end
RUBY
end
end

ActiveRecord::Base.send :extend, PathFinder

这种方法类似于acts_as_listacts_as_tree采用的方法。

关于ruby-on-rails - 如何访问从实例方法传递给 acts_as 插件(ActiveRecord 装饰器)的选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2206588/

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