рельсы-3.1 | Это случай для вложенной формы или случай для чего-то еще? - PullRequest
1 голос
/ 09 февраля 2012

Я работаю над приложением, которое будет использоваться в качестве бортового журнала для самолетов.Я могу быть направлен в неправильном направлении с дизайном моей базы данных.Любые рекомендации по этому поводу были бы полезны.Это ситуация для вложенных форм?Или это только в том случае, если мне нужно создать запись для обеих моделей одновременно?

На данный момент я так выложил модели:

class Location < ActiveRecord::Base
  has_many :aircrafts, :pilots
end

class Aircraft < ActiveRecord::Base
  belongs_to :location 
  has_many :trips
end

class Pilot < ActiveRecord::Base
  belongs_to :location 
  has_many :trips
end

class Trip < ActiveRecord::Base
  belongs_to :aircraft, :pilot
end

ActiveRecord::Schema.define(:version => 20120209014016) do

  create_table "aircrafts", :force => true do |t|
    t.string   "tail_number"
    t.decimal  "hobbs"
    t.integer  "location_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "aircrafts", ["location_id"], :name => "index_aircrafts_on_location_id"

  create_table "locations", :force => true do |t|
    t.string   "city"
    t.string   "state"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "pilots", :force => true do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.integer  "location_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "pilots", ["location_id"], :name => "index_pilots_on_location_id"

  create_table "trips", :force => true do |t|
    t.date     "date"
    t.integer  "aircraft_id"
    t.decimal  "hobbs_out"
    t.decimal  "hobbs_in"
    t.integer  "cycles_airframe"
    t.integer  "cycles_left"
    t.integer  "cycles_right"
    t.time     "time_out"
    t.time     "time_in"
    t.integer  "pic_id"
    t.integer  "sic_id"
    t.string   "flight_sequence"
    t.text     "remarks"
    t.integer  "miles"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

Что яхочу иметь возможность создать новую запись о поездке и обновить столбец: hobbs в записи о самолете.С таблицей самолетов я, по сути, хочу отслеживать текущее время Хоббса (или думать о нем как о текущем пробеге на автомобиле).Когда я создаю новую поездку, она использует текущее время Хоббса для атрибута hobbs_out, а hobbs_in будет записываться в поездку и использоваться для обновления Aircraft.hobbs.

Можно ли это сделать с помощью кода вtrip_controller?Что-то вроде:

def create
  @trip = Trip.new(params[:trip])
  @aircraft = Aircraft.where(params[:trip][:aircraft_id])
  @aircraft.hobbs = params[:trip][:hobbs_in]
  @aircraft.save

  respond_to do |format|
    if @trip.save
      format.html { redirect_to @trip, notice: 'Trip was successfully created.' }
      format.json { render json: @trip, status: :created, location: @trip }
    else
      format.html { render action: "new" }
      format.json { render json: @trip.errors, status: :unprocessable_entity }
    end
  end
end

Если это скорее форма вложенной формы, как я могу получить форму для простого обновления записи о самолете и создания новой записи о поездке?

Спасибо!

1 Ответ

0 голосов
/ 09 февраля 2012

Лично у меня на самом деле будут самолеты и аэропорты, и я буду структурировать БД следующим образом через эти рельсовые ассоциации, а затем перейти оттуда:

class Airport < ActiveRecord::Base
  has_many :planes
  belongs_to :trip
end

class Plane < ActiveRecord::Base
  belongs_to :Airport # Current location 
  has_many :trips
  has_many :pilots, :through => :trips
end

class Pilot < ActiveRecord::Base
  has_many :trips
  has_many :planes, :through => :trips
end

class Trip < ActiveRecord::Base
  belongs_to :plane
  belongs_to :pilot
  has_many :airports
end

Я думаю, что ссылка на вложения, которую вы используете, будет более уместной при разработке ваших маршрутоввозможно.
Например, если вы выполняете маршруты RESTful и вкладываете один: ресурс в другой: ресурс, тогда вы получаете все помощники рельсов, чтобы использовать это отношение.Вам просто нужно сделать пару вещей, например, сделать формы form_for[OuterModelName, InnerModelName].Однако по большей части Rails будет обрабатывать детали.

Для ресурсов (например, таблиц / моделей), к которым вы хотите иметь доступ по отдельности (например, вы хотите обновить самолет независимо от аэропорта).) тогда вам нужно иметь resources :plane в качестве отдельной линии маршрута (а также во вложении), т. е. будет две ссылки на этот ресурс.

В качестве последнего примечания, это resources, когдау вас будет index представление (несколько записей) и resource, когда вы используете только один экземпляр (show, edit, update и т. д.).

...