将表名作为参数传递给ruby方法

时间:2016-11-11 12:05:38

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5

我有N个表和N个函数。所有函数只有相同的代码表名更改。我是否可以使所有这些功能都使用通用功能。

像这样的东西

def funcN
  common_func(tableN)
end

private

def common_func(tablename)
  "Some Code"
end

我知道可能有多种方式.. 有哪些方法可以做到这一点?

3 个答案:

答案 0 :(得分:2)

如果型号名称在<script type="text/javascript"> board = JXG.JSXGraph.initBoard('jxgbox3', { axis:true, boundingbox:[-5.9,8,5.9,-5.9], keepaspectratio:true, showCopyright:false, showNavigation:false }); var qr = [], arc2,isInDragMode; qr[1] = board.create('point', [0,0], {style:5,fillColor:'#ff00ff'}); qr[2] = board.create('point', [5,0], {style:5,fillColor:'#ff00ff'}); qr[3] = board.create('point', [3.85,4.4], {style:5,fillColor:'#ff00ff'}); var triArr1 = [qr[3],qr[2],qr[1]]; var tri = board.createElement('polygon',triArr1, {strokeWidth:2, strokeColor:'#dd00dd',highlight:false}); var arc1 = board.create('nonreflexangle',triArr1, {radius:1,name:'&theta;2'}); var triArr2 = [qr[2],qr[1],qr[3]]; var arc2 = board.create('nonreflexangle',triArr2, {radius:1,name:'&theta;1'}); var triArr3 = [qr[1],qr[3],qr[2]]; var arc3 = board.create('nonreflexangle',triArr3, ,{fixed:false}, {radius:1,name:'&theta;3'}); board.create('text', [-5, 3, function () { if(arc2.Value() > Math.PI) { ang2 = (360 - arc2.Value() * 180 / Math.PI).toFixed(1); ang1 = (360 - arc1.Value() * 180 / Math.PI).toFixed(1); ang3 = (360 - arc3.Value() * 180 / Math.PI).toFixed(1); } else { ang2 = (arc2.Value() * 180 / Math.PI).toFixed(1); ang1 = (arc1.Value() * 180 / Math.PI).toFixed(1); ang3 = (arc3.Value() * 180 / Math.PI).toFixed(1); } return '<p>&theta;_1 = ' + ang2 + '&deg;</p>'+'<p>&theta;_2 = ' + ang1 + '&deg;</p>'+'<p>&theta;_3 = ' + ang3 + '&deg;</p>'+'<p>&theta;_1 + &theta;_2 + &theta;_3 = 180&deg;</p>'; }],{fixed:false}); 中是静态的,那么只需将其作为funcN传递,例如考虑string然后post或从铁轨记录funcN("Post") < / p>

在私有方法中捕获字符串参数作为您的funcN(@record.class.to_s),您可以通过tablename将其转换为模型

然后您可以继续使用该模型myModel = tablename.constantize

上的代码行

答案 1 :(得分:1)

你非常接近。只需将表名作为参数传递给funcN

def funcN(tableN)
  common_func(tableN)
end

private

def common_func(tablename)
  "Some Code"
end
  

有什么可能的方法呢?

从理论上讲,解决问题的方法无限多,所以你永远无法得到这个问题的答案。

P.S。您的命名不遵循惯例。以下是它的外观:

def func_n(table_name)
  common_func(table_name)
end

private

def common_func(table_name)
  # code omitted
end

答案 2 :(得分:0)

如果函数(通常称为Ruby中的方法)位于模型中,则它可以引用table_name。您可以使用模块共享公共代码,并将其包含在需要它的每个模型中,例如:

class Person < AR::Base
  include CommonCode
end

class Fruit < AR::Base
  include CommonCode
end

module CommonCode
  def do_something
    self.table_name
  end
end

Person.new.do_something # => 'people'
Fruit.new.do_something # => 'fruits'