Rails: вложенные атрибуты и модель? - PullRequest
0 голосов
/ 27 февраля 2012

Как новичок в RoR, я очень ценю любую помощь заранее! Я запутываю себя, когда пытаюсь создать модели, необходимые для следующего.

У меня есть 3 объекта: пользователи, организации и роли. Пользователи могут принадлежать к одной или нескольким организациям, но будут иметь только одну роль на организацию. Например:

Джон | Org1 | Владелец

Джон | Org2 | Сотрудник

Боб | Org1 | Сотрудник

Боб | Org2 | Владелец

Как мне настроить это в моих моделях (has_many, through =>?), А также чтобы у меня была форма редактирования, чтобы я мог обновлять информацию о пользователях, их организациях и ролях в одной форме? Примечание. Не уверен, что это уместно, но я намерен разрешить редактировать свою организацию только тем, кто является ее владельцем.

Еще раз спасибо!

EDIT Ниже приведено то, что у меня есть, плюс ошибка, которую я сейчас получаю:

Модели / user.rb

class User < ActiveRecord::Base
    has_many :org_roles 
    has_many :orgs, :through => :org_roles
    accepts_nested_attributes_for :orgs, :allow_destroy => true
    has_one :user_detail
    has_one :user_address

  attr_accessible :orgs
end

модель / org.rb

class Org < ActiveRecord::Base
end

Модели / role.rb

class Role < ActiveRecord::Base
end

Модели / org_role.rb

class OrgRole < ActiveRecord::Base
  belongs_to :user
  belongs_to :org
  belongs_to :role

  validates_presence_of   :user, :org, :role
  validates_uniqueness_of :org_id, :scope => :user_id
end

views / edit.html.erb

 #user form info above...
    <%=f.fields_for :orgs do |ff| %>  
      <div>Your Organization Name:<br />
      <%= ff.text_field :name%></div>
    <% end %>

Сообщение об ошибке:

Can't mass-assign protected attributes: orgs_attributes

РЕШИТЬ:

Добавлено: orgs_attributes для моей модели пользователя, attr_accessible

1 Ответ

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

Я бы создал четвертую модель под названием UserOrganization, которая имеет следующие атрибуты: user_id, organization_id и role_id. В рамках модели UserOrganization у меня будет следующее:

class UserOrganization < ActiveRecord::Base
  belongs_to :user
  belongs_to :organization
  belongs_to :role

  validates_presence_of   :user, :organization, :role
  validates_uniqueness_of :organization_id, :scope => :user_id
end

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

Связи для пользователя, организации и роли должны быть довольно просты с этой реализацией (у пользователя много организаций пользователей). Если вы хотите получить организации напрямую через модель пользователя, у вас также может быть has_many :organizations, :through => :user_organizations.

Также на ваш вопрос о форме редактирования, я бы порекомендовал вам прочитать о accepts_nested_attributes_for:

http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for

и

http://railscasts.com/episodes/196-nested-model-form-part-1

...