![](/img/trans.png)
[英]Ruby on Rails calling ActiveRecord model from within ActionController plugin module
[英]Calling Module Function From Model Rails
在尝试使用模块中的函数中定义的数组时,我得到一个method or variable not defined
的method or variable not defined
。
这是文件:
/lib/states.rb
module States
def fifty_states
[
'AL',
'AK',
'AZ',
'AR',
'CA',
'CO',
'CT',
'DE',
'FL',
'GA',
'HI',
'ID',
'IL',
'IN',
'IA',
'KS',
'KY',
'LA',
'ME',
'MD',
'MA',
'MI',
'MN',
'MS',
'MO',
'MT',
'NE',
'NV',
'NH',
'NJ',
'NM',
'NY',
'NC',
'ND',
'OH',
'OK',
'OR',
'PA',
'RI',
'SC',
'SD',
'TN',
'TX',
'UT',
'VT',
'VA',
'WA',
'WV',
'WI',
'WY'
]
end
end
/app/controller/player_to_team_histories_controller.rb
class PlayerToTeamHistory < ActiveRecord::Base
include States
def self.distinct_states
joins(:player).select("DISTINCT players.HometownState").where("players.HometownState IN (?)", fifty_states)
end
如果我打开一个控制台,我可以做到这一点:
>> include States
Object
>> fifty_states
["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"]
我认为你在这里混淆了课堂。 如果你想从类方法(即self.distinct_states
)中调用fifty_states
,那么你将不得不使用extend
,而不是include
:
module A
def foo
"myfoo"
end
end
class B
extend A
def self.bar
foo
end
end
B.bar
#=> "myfoo"
但请注意,您无法从实例调用该方法:
b = B.new
b.bar
#=> NoMethodError: undefined method `bar' for #<B:0x007fefc4e19db0>
这是一篇关于include
vs extend
更多讨论的文章 。
最后的信息总结得很好:
使用include实例方法并扩展类方法。 此外,有时可以使用include来添加实例和类方法。 两者都非常方便,并允许大量的代码重用。 它们还允许您避免深度继承,而只是模块化代码并将其包含在需要的地方,这更像是红宝石的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.