Rails 3 has_many: сквозная концепция - PullRequest
0 голосов
/ 01 сентября 2011

Мне нужна некоторая концептуальная помощь:
Предположим, что ваши пользователи по сути дела.У вас есть сотрудники, и у вас есть штатные должности.По сути, один сотрудник может занимать несколько должностей, а одна должность может занимать несколько сотрудников.
Мой have_many: сквозная работа между сотрудниками и должностями осуществляется через объединительную таблицу Staffization.Тем не менее, моя форма редактирования для сотрудника возвращает ВСЕ Позиции как флажки для всего приложения, а не только для этого конкретного пользователя.И никто не сохраняется, когда я отправляю обновление.Нужно ли делать что-то другое с моими ассоциациями, или есть лучший способ сузить данные в формах?
Мои модели:

class User < ActiveRecord::Base
  has_many    :employees,  :dependent => :destroy
  has_many    :positions,  :dependent => :destroy

class Employee < ActiveRecord::Base
  belongs_to :user
  has_many :positions, :through => :staffizations
  has_many :staffizations, :dependent => :destroy

class Position < ActiveRecord::Base
  belongs_to :user
  has_many :employees, :through => :staffizations
  has_many :staffizations, :dependent => :destroy

class Staffization < ActiveRecord::Base
  belongs_to :employee
  belongs_to :position

Форма редактирования полей моего сотрудника настроена для возвратафлажки для возможных позиций, которые мог бы занимать сотрудник, но возвращает все позиции во всем приложении и не обновляет данные, когда я нажимаю submit:

 - Position.all.each do |position|
   = check_box_tag :position_ids, position.position_name, @employee.positions.include?(position), :name => 'employee[position_ids][]'
   = label_tag :position_ids, position.position_name

Обновление контроллера моего сотрудника def добавило строку для have_many: через ассоциацию.Это где я должен сузить возврат до текущих вошедших в систему сотрудников и должностей пользователя?

@employee.attributes = {'position_ids' => []}.merge(params[:employee] || {})

Ответы [ 3 ]

2 голосов
/ 04 сентября 2011

Во-первых, если вы не используете:

class Employee
  has_and_belongs_to_many :positions
end

class Position
  has_and_belongs_to_many :employees
end

тогда вы можете сузить доступные позиции с помощью:

Position.where(:user_id => @employee.user_id).each # etc.

Вы могли бы даже сделать область для этого:

class Position
  def available_for_employee employee
    where(:user_id => employee.user_id)
  end
end

... и затем используйте это в помощнике, который генерирует ваши флажки

def position_checkboxes_for_employee employee
  Position.available_for_employee(employee).each do |position|
    = check_box_tag :position_ids, position.position_name, @employee.positions.include?(position), :name => 'employee[position_ids][]'
    = label_tag :position_ids, position.position_name
  end
end
1 голос
/ 02 сентября 2011

возврат ВСЕХ позиций в виде флажков - это именно то, что вы хотите, нет?Что делать, если сотрудник меняет должности?тогда вам понадобится этот флажок, а не только отмеченные ...

0 голосов
/ 04 сентября 2011

Спасибо другу, так как мой перерыв между сотрудниками и должностями принадлежит бизнесу. Мне нужно было добавить attr_accessible position_ids и attr_accessible employee_ids к соответствующим моделям. Кроме того, в поле просмотра сотрудника мне нужно было добавить параметры, чтобы при вызове вакансий вызывались только те позиции, которые связаны с этим бизнесом, например:

  - Position.find_all_by_user_id(@employee.user_id).each do |position|
   = check_box_tag :position_ids, position.id, @employee.positions.include?(position), :name => 'employee[position_ids][]'
   = label_tag :position_ids, position.position_title
...