Использование именованной области с find_or_create_by - PullRequest
1 голос
/ 10 января 2011

Я потратил некоторое время на выяснение этого и не видел постов других, так что, возможно, это кому-нибудь поможет.Кроме того, у меня нет большого опыта работы с 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

1 Ответ

1 голос
/ 10 января 2011

Вы можете просто использовать User.find_or_create_by_first_name_and_last_name(:first_name => "firstname", :last_name => "last_name")

...