Рельсы: две модели с отношением один к одному, один контроллер - PullRequest
1 голос
/ 20 марта 2012

Я создал простое веб-приложение с аутентификацией пользователя. Я сделал две модели: Users для аутентификации пользователя и Details для дополнительной информации о пользователе. Они связаны с one-to-one отношениями. У меня проблемы с обновлением двух моделей с одного контроллера.

Рекомендуется ли вообще ассоциация one-to-one в этом случае (я не хочу помещать слишком много полей в одну таблицу), и если да, то как правильно обрабатывать две модели через один контроллер?

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Проверка Вложенная модель Часть 1/2 отлитых рельсов. Оформить заказ рельсов, и вы можете наверняка выяснить :) Это объясняется для многих для многих отношений, незначительные изменения, и вы можете сделать это один на один.

Пример кода, который вы можете увидеть:

class Wiki < ActiveRecord::Base
  has_many :revisions 

  has_one :latest_revision, :class_name => "Revision", :order => 'updated_at desc', :limit => 1
  accepts_nested_attributes_for :revisions
end

class Revision < ActiveRecord::Base
  belongs_to :wiki
end


# new Wiki page, first revision
def new
  @wiki = Wiki.new
  @revision = @wiki.revisions.build
end

def create
  @wiki=Wiki.new(params[:wiki])
  @wiki.save
end

# adding a Revision to a Wiki page
def edit
  @wiki = Wiki.find(params[:id])
  @revision = @wiki.revisions.build # creating a new revision on edit
end

def update
  @wiki=Wiki.new(params[:wiki])
  @wiki.save
end

def show
  @wiki = Wiki.find(params[:id])
  @revision = @wiki.latest_revision
end
0 голосов
/ 20 марта 2012

Да, использование «один на один» для нас оправдано, как вы сказали, для того, чтобы держать вещи разделенными.Что касается доступа к ним из контроллера, вы должны иметь возможность делать это, если вы правильно определили ассоциации в моделях.

Модель пользователя должна иметь:

has_one : detail

, а модель детализации должна иметь:

belongs_to : user

, тогда если у вас есть внешний ключ с именем 'user_id' вТаблица «детали», все должно работать нормально.

теперь вы можете обращаться к обеим моделям, используя друг друга, например

User.find(1).detail

или

Detail.find(1).user

, теперь вы можете обновить обаодинаково с обоих их контроллеров.

...