私はこれを理解するのにしばらく時間を費やしましたが、他の人が投稿するのを見たことがないので、おそらくこれは誰かを助けるでしょう。また、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