1

私はこれを理解するのにしばらく時間を費やしましたが、他の人が投稿するのを見たことがないので、おそらくこれは誰かを助けるでしょう。また、Railsの経験があまりないので、修正や提案をいただければ幸いですが、以下のコードはうまく機能しているようです。

Railscast on virtual attributeで説明されているように、first_nameとlast_nameからfull_nameを作成するように仮想属性を設定しました。full_nameでも検索したかったので、ここでJimの回答に示されているように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
4

1 に答える 1

1

あなたはただ使うこともできます User.find_or_create_by_first_name_and_last_name(:first_name => "firstname", :last_name => "last_name")

于 2011-01-10T10:54:59.403 に答える