문제

나는 이것이 제대로 작동하더라도 어떻게 작동하는지에 대해 조금 혼란스러워합니다. 동일한 다른 모델과 두 개의 연관성이있는 모델이 있습니다.

회사에는 소유자가 있고 회사에는 수업 사용자의 직원이 많습니다.

다음은 내 회사 모델입니다.

class Company < ActiveRecord::Base
  validates_presence_of :name

  has_many :employee, :class_name => 'User'
  has_one :owner, :class_name => 'User'
  accepts_nested_attributes_for :owner, :allow_destroy => true
end

내 사용자 모델은 다음과 같습니다.

class User < ActiveRecord::Base
  include Clearance::User
  attr_accessible :lastname, :firstname #other attr are whitelisted in clearance gem
  validates_presence_of :lastname, :firstname
  belongs_to :company
end

이제 소유자를 포함 하여이 회사의 직원 3 명이 있다고 가정합니다. 처음 회사를 만들 때 ID 1을 가진 직원에게 소유자를 설정하고 다른 두 사람 (2,3)이 회사 _id (user.company = company)를 설정하여 직원 목록에 추가됩니다. 세 사람 모두 회사 _id가 회사 ID로 설정되어 있습니다.

회사 소유자를 요청하면 올바른 사용자를 얻고 회사를 할 때는 직원을 모두 얻을 수 있습니다.

소유자를 사용자 2로 변경하면 Company_ID를 NIL로 설정하여 직원에서 사용자 1을 자동으로 제거합니다. 이것은 괜찮습니다. 내가 그를 간단한 직원으로 다시 추가하면 모든 것이 여전히 좋습니다.

도대체 철도는 어느 것이 어느 것을 알고 있습니까? 내 말은 직원이 직원이 아니라 소유자라는 것을 어떻게 아는가? 스키마의 어떤 것도 이것을 정의하지 않습니다.

나는 소유자 협회를 뒤집고 회사를 사용자로 만들어야한다는 느낌이 들었습니다.

도움이 되었습니까?

해결책

지금 가지고 있듯이 소유자와 직원을 구별 할 수있는 것은 없습니다. 즉, 사람을 제거하거나 소유권을 바꾸려고 시도하면 문제가 발생할 것입니다.

François가 지적했듯이, 당신은 소유자가 ID가 가장 낮은 회사에 속하는 사용자라는 점에서 운이 좋았습니다.

문제를 해결하기 위해 모델이 다음 매너와 관련이 있습니다.

class Company < ActiveRecord::Base
  belongs_to :owner, :class_name => "user"
  has_many :employees, :class_name => "user"
  validates_presence_of :name
  accepts_nested_attributes_for :owner, :allow_destroy => true
end

class User < ActiveRecord::Base
  include Clearance::User
  attr_accessible :lastname, :firstname #other attr are whitelisted in clearance gem
  validates_presence_of :lastname, :firstname
  belongs_to :company
  has_one :company, :foreign_key => :owner_id
end

회사 테이블에 소유자 _id라는 다른 열을 추가해야하지만 이것은 당신의 관계를 더 명확하게 정의합니다. 소유자 변경과 관련된 문제를 피할 수 있습니다. 이 경로로 가서 데이터베이스를 설정하면 users.company_id와 companies.owner_id가 null이 될 수 없도록 주기적 종속성이있을 수 있습니다.

나는 얼마나 잘 받아 들여지는지 잘 모르겠습니다.

다른 팁

has_one은 구문 설탕입니다.

has_many :whatevers, :limit => 1

하나가 추가됩니다 :limit => 1 비트, 1 개의 레코드 만 반환되도록합니다. 하나의 선언이 있는데 :order 모든 상황에서 올바른 기록을 반환하려면 절입니다. 이 경우 직원에게 깃발을 넣어 소유자인지를 나타내고이 열을 정렬하여 올바른 레코드 1st를 얻습니다.

Rails가 어떻게 알 수 있는지에 대한 귀하의 질문은 대부분의 데이터베이스가 기본 키 순서로 레코드를 반환하기 때문입니다. 따라서 첫 번째 추가 직원에게는 ID 1이 있으므로 1st로 반환됩니다.

소유권이라는 모델을 가질 수 있습니다.

ownership belongs_to company   
ownership belongs_to user

user has_many ownerships
company has_one ownership
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top