私は現在のレールアプリで作業しているような難しい問題があります。私のアプリのユーザーの写真を共有します。写真は都市に関連付けることができるので、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
これが今の私の仕様をロッキングされるので、私は私の問題が解決されると思います。
これは、*私が探していたまさに*ものではありませんでしたが、あなたは私にインスピレーションを与え、私は、私は可能な解決策を見つけたと思います。参考のために質問に追加します。 – Andrew