[英]accessing instance methods inside a ruby/Rails class but outside an instance method
[英]Ruby: Can I use instance methods inside a class method?
我有一個包含這個類方法的類:
def self.get_event_record(row, participant)
event = Event.where(
:participant_id => participant.id,
:event_type_code => row[:event_type],
:event_start_date => self.format_date(row[:event_start_date])
).first
event = Event.new(
:participant_id => participant.id,
:event_type_code => row[:event_type],
:event_start_date => self.format_date(row[:event_start_date])
) if event.blank?
event
end
我在同一個類中也有一個實例方法:
def format_date(date)
parsed_date = date.split('/')
# if month or day are single digit, make them double digit with a leading zero
if parsed_date[0].split("").size == 1
parsed_date[0].insert(0, '0')
end
if parsed_date[1].split("").size == 1
parsed_date[1].insert(0, '0')
end
parsed_date[2].insert(0, '20')
formatted_date = parsed_date.rotate(-1).join("-")
formatted_date
end
我為#format_date
收到了“未定義的方法”錯誤。 (我嘗試了不self
前,在第一個)。 你能不能在同一個類的類方法中使用實例方法?
簡短的回答是否定的,你不能在類方法中使用類的實例方法,除非你有類似的東西:
class A
def instance_method
# do stuff
end
def self.class_method
a = A.new
a.instance_method
end
end
但據我所知, format_date
不一定是實例方法。 所以寫format_date就好
def self.format_date(date)
# do stuff
end
只需創建類方法
def self.format_date (..)
...
end
如果你需要實例方法,請將它委托給類方法
def format_date *args
self.class.format_date *args
end
我不認為從類范圍調用實例方法是個好主意
你可以做YourClassName.new.format_date(your_date)
,雖然我認為很明顯你應該重構你的代碼 - 這個方法可能不屬於實例。 為什么不擴展Date類,或者將format_date
作為您正在使用的類的類方法?
編輯:以下是您的代碼需要考慮的其他一些事項:
format_date
方法花了很多篇幅來操作日期作為字符串。 為什么不使用Ruby的Date類? 使用Date.parse
或Date.strptime
甚至"01/01/2001".to_date
可能很有用,具體取決於您的語言環境 如果您確實需要創建自己的方法,請考慮為您的方法擴展String類:
class String def to_friendly_formatted_date Date.strptime(self, "%d/%m/%y") end end "01/08/09".to_friendly_formated_date
你的類方法正在為find_or_initialize_by
輔助方法哭泣:
self.get_event_record(row, participant) find_or_initialize_by_participant_id_and_event_type_code_and_event_start_date(:participant_id => participant.id, :event_type_code => row[:event_type_code], :event_start_date => row[:event_start_date].to_friendly_formatted_date) end
通過上帝很長,但它實現了你想要更優雅地做的事情(雖然我願意參與爭論!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.