2012-11-30 35 views
0

嘗試使用在模塊中的函數中定義的數組時,我得到了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"] 

回答

2

我覺得你在這裏的例子令人困惑。如果你想調用fifty_states方法(即self.distinct_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> 

下面是an articleinclude VS extend更多的討論。

末金額東西好消息:

使用包括實例方法和擴展類的方法。另外,有時使用include可以添加實例和類方法。兩者都非常方便,並允許大量的代碼重用。它們還允許您避免深層繼承,而只是將代碼模塊化並將其包含在需要的地方,這更多地是紅寶石的方式。