1

現在の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

これは現在私の仕様を揺るがしているので、問題は解決したと思います。

4

1 に答える 1

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")
)
于 2012-03-05T23:52:31.953 に答える