![](/img/trans.png)
[英]How do I assign a newly created object to a model it belongs to in rails
[英]How Do I get a newly created method to work in the rails console
我在其中一個模型中創建了一個相當簡單的新方法。 但是,當我進入Rails控制台進行測試時,出現以下錯誤:
NoMethodError: undefined method 'get' for #<Class:0x3a5032fc>
我已經保存了代碼,關閉了Rails控制台,然后重新啟動,但是我仍然得到NoMethod
class Race <ActiveRecord::Base
def get(race_date,track_name,race_number)
Race.where(:date =>race_date, :race_nbr => race_number, :track_id => (Track.where(:track_code => track_name)))
end
end
在控制台中,輸入以下內容:
Race.get("2011-12-04", "BEL", 1)
產生NoMethodError:undefined method 'get'
。
任何想法將不勝感激。
您定義了Race類的實例方法。 也許您會定義一個類方法,例如:
def self.get(race_date, track_name, race_number)
track = Track.where(:track_code => track_name)
Race.where(:date => race_date, :race_nbr => race_number, :track_id => track)
end
然后,您可以使用Race.get
。
@lucapette正確了; 您需要創建一個類方法。 下面是定義類方法的另一種方法。 在定義大量類方法的大型項目中,這可能是一種組織代碼的更簡潔的方法,但是這種觀點純粹是主觀的。
class << self
def get(race_date,track_name,race_number)
Race.where(:date => race_date,
:race_nbr => race_number,
:track_id => (Track.where(:track_code => track_name)))
end
end
在class << self
定義的所有內容都將成為一個類方法。
另一種選擇是使用范圍。
scope :get,
lambda { |race_date, track_name, race_number|
Race.where(:date => race_date,
:race_nbr => race_number,
:track_id => (Track.where(:track_code => track_name))) }
最后一個解決方案作為范圍看起來有點笨拙,因此在這種情況下最好使用類方法代替范圍。 另外,我更喜歡具有描述性名稱的作用域,但是我想這也將適用於方法名稱。
經過兩個很好的回答,我覺得應該說些別的話:
如果您的控制台已經啟動,它不會猜測您已經添加了一些代碼,因此您必須重新加載。
這樣做,只需鍵入:
reload!
在控制台中(無需CTRL-C)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.