gpt4 book ai didi

ruby-on-rails - 用一段独立的代码扩展 Ruby 类

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

我有一个 Rails 应用程序,其中包含多个具有相同结构的模型:

class Item1 < ActiveRecord::Base
WIDTH = 100
HEIGHT = 100
has_attached_file :image, styles: {original: "#{WIDTH}x#{HEIGHT}"}
validates_attachment :image, :presence => true
end


class Item2 < ActiveRecord::Base
WIDTH = 200
HEIGHT = 200
has_attached_file :image, styles: {original: "#{WIDTH}x#{HEIGHT}"}
validates_attachment :image, :presence => true
end

实际代码更复杂,但为了简单起见,这已经足够了。

我想我可以把代码的公共(public)部分放在一个地方,然后在所有模型中使用它。

这是我想到的:

class Item1 < ActiveRecord::Base
WIDTH = 100
HEIGHT = 100
extend CommonItem
end

module CommonItem
has_attached_file :image, styles: {original: "#{WIDTH}x#{HEIGHT}"}
validates_attachment :image, :presence => true
end

显然它不起作用有两个原因:

  1. CommonItem 不知道我调用的类方法。
  2. WIDTHHEIGHT 常量在 CommonItem 而不是 Item1 中查找。

我尝试使用include代替extendclass_eval和类继承的一些方法,但都没有用。

看来我遗漏了一些明显的东西。请告诉我是什么。

最佳答案

这是我的做法:

class Model
def self.model_method
puts "model_method"
end
end

module Item
def self.included(base)
base.class_eval do
p base::WIDTH, base::HEIGHT
model_method
end
end
end

class Item1 < Model
WIDTH = 100
HEIGHT = 100
include Item
end

class Item2 < Model
WIDTH = 200
HEIGHT = 200
include Item
end

included 方法在模块被包含时被调用。

我想我已经设法创建了一个与您的问题相似的结构。该模块正在调用项目类从 Model 类继承的方法。

输出:

100
100
model_method
200
200
model_method

关于ruby-on-rails - 用一段独立的代码扩展 Ruby 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13333256/

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