Rails Лучшие практики: создание связанных объектов в модели - PullRequest
0 голосов
/ 09 марта 2012

У меня есть три основных таблицы: пользователи (электронная почта, пароль), контакты (имя, телефон), отношения (идентификатор_пользователя, идентификатор_пользователя, уровень).

Когда пользователь создает новый контакт, я хочу, чтобы он был связан с ним. Ассоциация имеет уровень "дружбы" от 1 до 3.

Я использую форму для ввода уровня в моих контактах # создаю контроллер.

Пока у меня есть это, которое прекрасно работает

  def create
    @contact = Contact.new(params[:contact])
    if @contact.save
      #@relation = Relation.new(:user_id => current_user.id, :contact_id => @contact.id, :level => params[:relation])
      #@relation.save
      redirect_to root_url, :notice => "ok!"
    else
      render "new"
    end
  end

Я думал о том, чтобы переместить создание отношений в мою модель контактов, чтобы сделать что-то вроде этого:

  after_create { Relation.create(user_id: current_user.id, contact_id: self.id, level: params[:relation]) }

Конечно, это не работает, но вы поняли. Было бы хорошо, чтобы это было в модели, или я могу оставить это, как сейчас

ура

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Я бы предпочел оставить его в контроллере, как он есть.Для тестирования (и, возможно, для других) целей, вы можете не захотеть, чтобы пользователи и контакты были связаны друг с другом так тесно.Я вижу это в том, что контроллер - это место, где можно связать воедино логику создания, а методы, подобные after_create в модели, предназначены для установки определенных параметров, а не для создания новых ассоциаций, что в будущем может не потребоваться,

tl; dr - вставка чего-то подобного в контроллер слишком тесно связывает две модели.

1 голос
/ 10 марта 2012

contact.rb

has_one :relation
accepts_nested_attributes_for :relation

отношение

belongs_to :contact
belongs_to :user

Просмотров как

= for_form @contact do |f|
  = f.fields_for :relation do |r|
    = r.text_field :level
  = f.submit 'create'

контроллер нового действия

  @contact = Contact.new
  @contact.build_relation # create new relation object for the contact

контроллер создать действие

  @contact = Contact.new(params[:contact])
  @contact.relation.user = current_user
  @contact.save
1 голос
/ 09 марта 2012

Как то так? По сути, просто создайте отношение и свяжите все в одном, связанное с current_user.

current_user.relations.create (contact: Contact.new (params [: contact]), уровень: params [: отношение])

Не перемещайте его в after_create. Если что-то создаст функцию где-нибудь, которая принимает пользователя, контакт и отношение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...