[英]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.