2012-03-05 10 views
1

私は現在のレールアプリで作業しているような難しい問題があります。私のアプリのユーザーの写真を共有します。写真は都市に関連付けることができるので、City has_many :photos。オートコンプリートと自然言語の構文を使って、ユーザーが自分の写真を都市と関連付けることができるようにしたい。すなわち:New York、NYまたはParis、France。Rails:仮想属性で検索または作成

私はユーザーが「アテネ」場合、彼らはとのリストを見ることになるように、オートコンプリートテキストボックスでこれを行うにはしたいと思います:

Athens, Greece 
Athens, GA 

...と人が実際に「アテネを望んでいた場合、TX "と入力するだけで、新しい都市レコードが作成されます。

私の都市モデルのフィールドはname, state, countryです。州と国は2文字の郵便番号です(私はそれらを検証するためにカルメンを使います)。 full_nameという仮想属性があり、北米の都市では「都市、州コード」(ニューヨーク、ニューヨークなど)、その他の都市では「都市、国名」(フランス、パリなど)が返されます。

def full_name 
    if north_american? 
     [name, state].join(', ') 
    else 
     [name, Carmen.country_name(country)].join(', ') 
    end 
end 

def north_american? 
    ['US','CA'].include? country 
end 

私の質問はどのように私は都市名と状態コードまたは国名のいずれかの文字列を受け入れ、そのレコードを見つけるか、作成することができますfind_or_createメソッドを作成することができ、テキストフィールドの作業を取得するために、ありますか?


更新 Kandadaの答えに触発さ

私は少し違う何かを思い付いた:

def self.find_or_create_by_location_string(string) 
    city,second = string.split(',').map(&:strip) 
    if second.length == 2 
    country = self.country_for_state(second) 
    self.find_or_create_by_name_and_state(city, second.upcase, :country => country) 
    else 
    country = Carmen.country_code(second) 
    self.find_or_create_by_name_and_country(city, country) 
    end 
end 

def self.country_for_state(state) 
    if Carmen.state_codes('US').include? state 
    'US' 
    elsif Carmen.state_codes('CA').include? state 
    'CA' 
    else 
    nil 
    end 
end 

これが今の私の仕様をロッキングされるので、私は私の問題が解決されると思います。

答えて

2
class Photo < ActiveRecord::Base 

    attr_accessor :location 

    def self.location_hash location 
    city,state,country = location.split(",") 
    country = "US" if country.blank? 
    {:city => city, :state => state, :country => :country} 
    end 

end 

今、あなたに「find_or_create_by_ *」

Photo.find_or_create_by_name(
    Photo.location_hash(location).merge(:name => "foor bar") 
) 
+0

これは、*私が探していたまさに*ものではありませんでしたが、あなたは私にインスピレーションを与え、私は、私は可能な解決策を見つけたと思います。参考のために質問に追加します。 – Andrew

関連する問題