rails3 has_one создание модели ассоциации - PullRequest
0 голосов
/ 14 декабря 2010

Я новичок в Rails3, и я просто пытаюсь заставить последнюю вещь сработать, прежде чем назвать это ночью.Ситуация следующая (пожалуйста, если код ужасен, просто дайте мне знать, все еще учитесь):

Я хочу записать погружение.У меня может быть новое местоположение в этом погружении, и в этот момент мне нужно создать новое местоположение, а затем создать погружение.Место для дайвинга has_one.Место имеет множество погружений.В настоящее время внешний ключ находится в состоянии погружения как location_id.

Как правильно в моем dives_controller создать местоположение, получить идентификатор и передать его в мое новое погружение?Было бы неплохо вызвать конструктор Location, но если он не работает таким образом, то это тоже нормально.

Мой код ниже:

class Dive < ActiveRecord::Base
    belongs_to :user
    has_one :location

end

require 'json'
require 'net/http'
require 'uri'

class Location < ActiveRecord::Base
    has_many :dive

    def initialize(location)
        @name = location[:name]
        @city = location[:city]
        @region = location[:region]
        @country = location[:country]

        url = "http://maps.googleapis.com/maps/api/geocode/json?address="+location[:city].sub(' ', '+')+"+"+location[:region].sub(' ', '+')+"+"+location[:country].sub(' ', '+')+"&sensor=false"
        resp = Net::HTTP.get_response(URI.parse(url))
        googMapsResponse = JSON.parse(resp.body)

        @latitude = googMapsResponse["results"][0]["geometry"]["location"]["lat"]
        @longitude = googMapsResponse["results"][0]["geometry"]["location"]["lng"]
    end

    def to_str
        "#{self.name}::#{self.city}::#{self.region}::#{self.country}"
    end
end

class DivesController < ApplicationController
  def create
    @dive = Dive.new(params[:dive])

    if params[:location][:id] == "" then
        @location = create_location(params[:location])

        @dive.location_id = @location.id
    else
        @dive.location_id = params[:location][:id]
    end

    @dive.user_id = params[:user][:id]
  end
end

1 Ответ

0 голосов
/ 15 декабря 2010

На самом деле, ваше моделирование требует некоторой работы, и вы должны взглянуть на nested_attributes.

class Dive < ActiveRecord::Base
    belongs_to :user
    has_one :location
end

class Location < ActiveRecord::Base
    has_many :dives

    def to_str
        ...
    end
end

class DivesController < ApplicationController
  def create
    @dive = Dive.new(params[:dive])

    if params[:location][:id] == "" then
        # Create new Location
        @location = Location.new(params[:location])
        url = "http://maps.googleapis.com/maps/api/geocode/json?address=" +
            @location[:city].sub(' ', '+') + "+" + 
        @location[:region].sub(' ', '+') + "+" + 
            @location[:country].sub(' ', '+') + "&sensor=false"
        resp = Net::HTTP.get_response(URI.parse(url))
        googMapsResponse = JSON.parse(resp.body)

        @location.latitude  = googMapsResponse["results"][0]["geometry"]["location"]["lat"]
        @location.longitude = googMapsResponse["results"][0]["geometry"]["location"]["lng"]
        @location.save

        @dive.location = @location
    else
        @dive.location_id = params[:location][:id]
    end

    # This can be improved
    @dive.user_id = params[:user][:id]

    if @dive.save
        # do something
    else
        # do something else
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...