سؤال

ولدي نموذج المستخدم مع سمات "أولا" و "آخر" هكذا على سبيل المثال User.first.first # => "تشارلي" User.first.last # => "براون"

ويحتوي هذا النموذج للمستخدم أيضا سمة افتراضية "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 العمود الذي يحصل على تعيين كل وقت بعد حفظ تصفية مع CONCAT من الأول والأخير. حتى العثور اسم الشخص، وخاصة مع ذاكرة غامض من هذا الشخص، غير مفيدة. حتى إذا تذكرت "دو" في اسم إما الأول أو الأخير ذلك الشخص، ويمكنني أن تفعل دائما User.find_by_full_name بسيطة ( 'دو') للعودة أكبر عدد ممكن لزيادة يعلقون عليه.

ونظرا لأنه هو العمود، ويمكنني أن بحث عنها في البحث (: الظروف [...]) شرط إذا لا بد لي أن تفعل شيئا مثل Project.find(:all,:include => :users, :conditions=>['users.full_name LIKE ?', query]) حيث

#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

هل كانت مفيدة؟

المحلول

ويمكنك استخدام named_scope في user.rb الخاص بك:

named_scope :find_by_full_name, lambda {|full_name| 
  {:conditions => {:first => full_name.split(' ').first, 
     :last => full_name.split(' ').last}}
}

وبعد ذلك يمكنك أن تفعل User.find_by_full_name('John Carver')

والاشياء الجديدة في استجابة للتغيرات في متطلبات

named_scope :find_by_full_name, lambda {|full_name| 
  {:conditions => ["first LIKE '%?%' or last LIKE '%?%'", 
    full_name.split(' ').first, full_name.split(' ').last]}}

نصائح أخرى

ولقد وجدت الإجابة جيم مفيدة كذلك. شكر. فما استقاموا لكم فاستقيموا إجراء تغيير طفيف على الرغم من. يسبب هذا الرمز الحالي الذي يفك أي أسماء المتوسطة. ما قلته أدناه هو فوضوي قليلا ولكن يحفظ أسماء المتوسطة ومجمع الأسماء الأخيرة (اعتقد جان كلود فان دام). كل شيء بعد الاسم الأول يذهب في مجال LAST_NAME.

named_scope :find_by_full_name, lambda { |full_name| 
 {:conditions => {:first_name => full_name.split(' ').first, 
   :last_name => full_name.split(' ')[1, full_name.split(' ').length-1].join(' ')}
   }
}

وبطبيعة الحال بأي شكل من الأشكال نظافة للقيام بذلك هي موضع ترحيب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top