0

Rails の理解を深めるために、data_mapper を使用する Sinatra アプリを変換しています。

データベースを検索し、検索されたレコードの最初のインスタンスを返すデータマッパーの「最初の」メソッドの最良の代替品を見つけようとしています。

これが正しく行われたかどうか、またはより良い解決策があるかどうか、誰でもコメントできますか?

シチュエーション #1 シナトラ

url = Url.first(:original => original) 

Rails (どちらでもOK?)

url = Url.find_by_original(original) #this  find_by_original
url = Url.where(:first_name => 'original')

状況#2

シナトラ

raise 'Someone has already taken this custom URL, sorry' unless Link.first(:identifier => custom).nil?

私のレール (検索あり)

raise 'Someone has already taken this custom URL, sorry' unless Link.find(:identifier => custom).nil?  #this  Link.find

元のコンテキストは URL を短縮するメソッドでした

def self.shorten(original, custom=nil)
    url = Url.first(:original => original) 
    return url.link if url    
    link = nil
    if custom
      raise 'Someone has already taken this custom URL, sorry' unless Link.first(:identifier => custom).nil?
      raise 'This custom URL is not allowed because of profanity' if DIRTY_WORDS.include? custom
      transaction do |txn|
        link = Link.new(:identifier => custom)
        link.url = Url.create(:original => original)
        link.save        
      end
    else
      transaction do |txn|
        link = create_link(original)
      end    
    end
    return link
  end
4

1 に答える 1

0

モデルでバリデーターを使用できます。validates_uniqueness_of :first_nameUrl モデル (app/models/url.rb) でa を実行するだけです。Railsガイドで利用可能な他の検証もあります

編集

そのようなレコードが手動で存在するかどうかを本当に調べたい場合。あなたはただやっUrl.find(:first, :conditions => { :first_name => 'original' })てnilをチェックすることができます

raise 'Someone has already taken this custom URL, sorry' unless Link.find(:first, :conditions => { :identifier => custom }).nil?

また、Rails を初めて使用する場合は、query インターフェイスを参照してください。個人的には、squeel gem を使用するのが好きなので、クエリは ruby​​ ステートメントと sql ステートメントを混在させるのではなく、厳密に ruby​​ です。

于 2012-09-09T02:15:56.580 に答える