Как установить атрибут модели соединения на лету при создании отношения? - PullRequest
3 голосов
/ 16 октября 2011

У меня есть has_many: через отношения между пользователями и проектами через модель объединения прав собственности.Я хочу иметь возможность установить атрибут модели владения при создании отношений между пользователем и новым проектом.Вот что у меня есть:

def create
    @project = Project.new(params[:project])
    if @project.save
      current_user.projects << @project
      flash[:success] = "Project created!"
      redirect_to @project
    else
      flash[:error] = "Project not created."
    end
  end

По сути, я не знаю, как установить значение "owner_type" в модели владения при создании нового проекта для данного пользователя, поскольку я непрямо упомяните модель соединения владения в контроллере создания проектаКак мне это сделать?

Вот моя модель владения (присоединения):

class Ownership < ActiveRecord::Base
  attr_accessible :owner_type

  belongs_to :project
  belongs_to :user

  validates :user_id, :presence => true

  validates :project_id, :presence => true

  validates :owner_type, :presence => true

end

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

class User < ActiveRecord::Base
  attr_accessible :name, :email, :admin, :projects

  has_many :ownerships
  has_many :projects, :through => :ownerships

  accepts_nested_attributes_for :projects

и модель моего проекта:

class Project < ActiveRecord::Base
      attr_accessible :name, :description

      has_many :ownerships
      has_many :users, :through => :ownerships

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Ключ заключается в том, что вы строите (а не создаете) связь до того, как нажмете @project.save, когда вы нажмете сохранить, сначала сохранится проект, и если он был успешно сохранен, будет также создана собственность.

def create
  @project = Project.new(params[:project])
  @project.ownerships.build(:user => current_user, :owner_type => 'chief')

  if @project.save
    flash[:success] = "Project created!"
    redirect_to @project
  else
    flash[:error] = "Project not created."
  end
end
1 голос
/ 16 октября 2011

РЕДАКТИРОВАТЬ: Это на самом деле не работает для меня.

В моей пользовательской модели я допускаю вложенные атрибуты с этой строкой:

accepts_nested_attributes_for :projects

Затем в моих проектах # создать контроллерВо время создания ассоциации между пользователем и новым проектом я вложил атрибут следующим образом:

current_user.ownerships.create(:owner_type => 'designer', :project => @project)

Если честно, я не совсем уверен, почему это работает, но работает.Было бы здорово, если бы кто-то еще это объяснил.

...