現在のRailsアプリで取り組んでいるトリッキーな問題があります。私のアプリでは、ユーザーが写真を共有しています。写真は都市に関連付けることができるので、City has_many :photos
. オートコンプリートと自然言語構文を使用して、ユーザーが自分の写真を都市に関連付けられるようにしたいと考えています。つまり、ニューヨーク州ニューヨークまたはフランスのパリです。
ユーザーが「Athens」と入力すると、次のリストが表示されるように、オートコンプリート テキスト ボックスでこれを行いたいと思います。
Athens, Greece
Athens, GA
...そして、その人が実際に「テキサス州アテネ」を望んでいる場合は、それを入力するだけで、新しい都市レコードが作成されます。
私の都市モデルには、フィールドがありますname, state, country
。州と国は 2 文字の郵便番号です (検証には Carmen を使用しています)。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 メソッドを作成するにはどうすればよいですか?
アップデート
神田の答えに触発されて、少し違うものを思いつきました:
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
これは現在私の仕様を揺るがしているので、問題は解決したと思います。