根据OP的进一步澄清,我现在有了我的想法。
模型继承适用于其他 OOP 语言,但在 Ruby 中不是必需的。在这种情况下,我认为最好的解决方案是使用 Module。
您仍然需要两个模型 Foo 和 Bar ,它们甚至可以具有不同的属性。
然后,定义模型和控制器的常用方法
# lib/product_model.rb
module ProductModel
def product_method_a
end
def product_method_b
end
end
# lib/product_controller.rb
module ProductController
def show
@obj = @model.constantize.find(params[:id])
render 'products/show' # need to explicitly specify it because this is general
end
def index
@objs = @model.constantize.scoped
render 'products/index' # need to explicitly specify it because this is general
end
end
然后,在 Foo 和 Bar 中使用这些方法,并根据需要添加自定义方法。
class Foo < ActiveRecord::Base
include ProductModel
def serial_number
# Foo's way
end
end
class Bar < ActiveRecord::Base
include ProductModel
def serial_number
# Bar's way
end
end
对于控制器。
class FoosController < ApplicationController
@model = "foo"
include ProductController
end
class BarsController < ApplicationController
@model = "bar"
include ProductController
end
对于视图,ProductController 已经定义了它们,只是为了在视图中使用通用的匹配变量名。
<%= @obj.title %>
很干,不是吗?