'first' および 'last' 属性を持つユーザー モデルがあるので、たとえば User.first.first #=> "Charlie" User.first.last #=> "Brown"
この User モデルには、仮想属性 'full_name' もあります
#user.rb
def full_name
[first,last].join(' ')
end
def full_name=(name) #don't know what to do with people w/ middle names
split = name.split(' ')
self.first = split[0]
self.last = split[1]
end
たとえば、次のようになります。
User.first.full_name = "Charlie Brown" #=> "Charlie Brown"
User.first.full_name = "Homer Simpson" #=> "Home Simpson"
User.first.save
User.first.first #=> "Homer"
User.first.last #=> "Simpson"
たとえば、動的検索の場合、その仮想属性で検索できればとてもいいでしょう。
User.find_by_full_name('Home Simpson') # this doesn't work
検索条件の例:
User.all(:conditions => ['full_name LIKE ?', query]) #this doesn't work
これを行うことができるSQL言語で少なくともいくつかの方法を見つけたいと思っています。動的仮想属性も見つかった場合、それはシュトルーデルの追加のバニラ ソースです。(この冬持ってる人いますか?)
また、検索される名前についても懸念していました。たとえば、「ホームズ」は「最初」の列でのみ検索され、「最後」の列では検索されない可能性がありますUser.first.full_name #=> "Sherlock Holmes"
。
私はより包括的な検索を試みました:
user.rb
def self.find_by_full_name(name) #returns an array of User model
return all if name.blank?
split = name.split(' ', 2)
output = []
if split.length > 1
with_scope( :find => { :conditions => ['first LIKE ?', "%#{split[0]}%"] }) do
output << all(:conditions => ['last LIKE ?', "%#{split[1]}%"])
output.flatten!
end
elsif split.length == 1
output << all(:conditions => ['first LIKE ?', "%#{split[0]}%"])
output << all(:conditions => ['last LIKE ?', "%#{split[0]}%"])
output.flatten!
end
end
例えば
User.find_by_full_name("John").map(&:full_name) #=> ["John Resig", "John Doe"]
User.find_by_full_name("Doe").map(&:full_name) #=> ["John Doe", "Philips Doeringer"]
User.find_by_full_name("John Doe").map(&:full_name) #=> ["John Doe"]
しかし、ここでの find_by_full_name メソッドは少し扱いにくいと思いました。
つまり、最初と最後を連結した保存後のフィルタによって毎回設定される列 full_name があったとします。そのため、特にあいまいな記憶を持つ人の名前を見つけることは役に立ちます。したがって、その人の姓または名のいずれかで「Doe」を覚えていた場合、単純な User.find_by_full_name('Doe') をいつでも実行して、できるだけ多くの名前を返し、それをさらに突き止めることができます。
Project.find(:all,:include => :users, :conditions=>['users.full_name LIKE ?', query])
これは列なので、 whereのようなことをしなければならない場合は、find(:conditions[...]) 句で検索できます。
#project.rb
has_many :assignments
has_many :users, :through=>:assignments
#user.rb
has_many :assignments
has_many :projects, :through => :assignments
#assignment.rb
belongs_to :user
belongs_to :project
ハッピーホリデーN