Я потратил некоторое время на выяснение этого и не видел постов других, так что, возможно, это кому-нибудь поможет.Кроме того, у меня нет большого опыта работы с Rails, поэтому я был бы благодарен за любые исправления или предложения, хотя приведенный ниже код, кажется, работает хорошо.
Я настроил виртуальный атрибут, чтобы сделать full_name изfirst_name и last_name, как обсуждалось в Railscast для виртуальных атрибутов .Я также хотел выполнить поиск по полному имени, поэтому я добавил named_scope, как предложено в ответе Джима здесь .
named_scope :find_by_full_name, lambda {|full_name|
{:conditions => {:first => full_name.split(' ').first,
:last => full_name.split(' ').last}}
}
НО ... Я хотел иметь возможность использовать все это как: find_or_create_by_full_name.Создание именованной области с таким именем обеспечивает только поиск (он идентичен приведенному выше коду: find_by_full_name), то есть он не выполняет то, что я хочу.Поэтому, чтобы справиться с этим, я создал метод класса для моего класса User, который называется: find_or_create_by_full_name
# This gives us find_or_create_by functionality for the full_name virtual attribute.
# I put this in my user.rb class.
def self.find_or_create_by_full_name(name)
if found = self.find_by_full_name(name).first # Because we're using named scope we get back an array
return found
else
created = self.find_by_full_name(name).create
return created
end
end