ActiveScaffold — при вставке новой записи, как включить поля ввода для столбца/модели, к которой принадлежит создаваемая модель

У меня есть следующая схема базы данных:

 create_table "addresses", :force => true do |t|
    t.string   "road"
    t.string   "city"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "client_id"
  end

  create_table "clients", :force => true do |t|
    t.integer  "address_id"
    t.integer  "order_id"
    t.string   "first_name"
    t.string   "last_name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "orders", :force => true do |t|
    t.integer  "order_id"
    t.integer  "client_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

и модели:

class Client < ActiveRecord::Base
    belongs_to :address
end

class Order < ActiveRecord::Base
    belongs_to :client
end

class Address < ActiveRecord::Base
end

Цель этой настройки состоит в том, чтобы иметь записи многих клиентов, каждый клиент имеет адрес. Один и тот же адрес может быть у нескольких клиентов. Для этой цели используется client_id в таблице адресов.

Когда я посещаю представление /Clients ActiveScaffold и нажимаю «Создать», я могу ввести данные для нового клиента, включая данные нового адреса для клиента.

Но, когда я захожу в представление /Orders и нажимаю создать, я могу добавить нового клиента и ввести данные для него, но для адреса есть только поле выбора, которое можно использовать только для выбора существующего адреса, есть нет полей для создания нового адреса для нового клиента. Как я могу включить поля адреса для нового клиента, чтобы создать новый адрес для клиента?

заранее спасибо


person denysonique    schedule 16.02.2011    source источник


Ответы (1)


На самом деле не так далеко ActiveScaffold, но ассоциации в ваших таблицах выглядят немного странно — у вас есть внешний ключ с обеих сторон отношения, то есть:

адреса имеют client_id

и

clients имеет address_id

Я бы подумал, что строго необходима только одна сторона, например client_id в адресах.

Возможно, связаны, но у вас есть «принадлежит_кому» по обе стороны отношений — возможно, одна сторона должна быть has_one, то есть:

class Client
  has_one :address
end

class Address
  belongs_to :client
end

Надеюсь, это поможет, Крис.

person Chris Kimpton    schedule 23.02.2011
comment
Спасибо за ответ на мой вопрос, но на самом деле я написал свои собственные контроллеры форм для этой цели и т. д. Я больше не использую ActiveScaffold для этого проекта. - person denysonique; 25.02.2011
comment
@denysonique - не беспокойтесь, полезно знать. В эти дни я был rails_admin для rails3, и, как вы сказали, это просто временная мера, пока мы не начнем правильно писать для приложения :) - person Chris Kimpton; 26.02.2011