ste*_*her 11 ruby ruby-on-rails class-method instance-methods
我有一个包含这个类方法的类:
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
Run Code Online (Sandbox Code Playgroud)
我在同一个类中也有一个实例方法:
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
Run Code Online (Sandbox Code Playgroud)
我得到一个'未定义的方法'错误#format_date.(self起初,我没有在前面尝试过它).你能不能在同一个类的类方法中使用实例方法?
tdg*_*dgs 26
简短的回答是否定的,你不能在类方法中使用类的实例方法,除非你有类似的东西:
class A
def instance_method
# do stuff
end
def self.class_method
a = A.new
a.instance_method
end
end
Run Code Online (Sandbox Code Playgroud)
但据我所知,format_date不一定是实例方法.所以写format_date就好
def self.format_date(date)
# do stuff
end
Run Code Online (Sandbox Code Playgroud)
只需创建类方法
def self.format_date (..)
...
end
Run Code Online (Sandbox Code Playgroud)
如果您需要实例方法,则将其委托给类方法
def format_date *args
self.class.format_date *args
end
Run Code Online (Sandbox Code Playgroud)
而且我认为从类范围调用实例方法不是一个好主意