0

두 개의 클래스 사용자 및 프로젝트가 있습니다. 사용자는 많은 프로젝트를 소유 할 수 있으며 많은 사용자가 프로젝트를 소유 할 수 있습니다. 그러나 프로젝트에는 최소한 하나의 사용자가 있어야하며 사용자는 프로젝트를 가질 필요가 없습니다. 우리가 프로젝트를 생성하기 전에has_many를 사용하여 새 객체를 기존 객체와 연결

class Project < ActiveRecord::Base 
    attr_accessible :prj_id, :name 
    has_many :ownerships, foreign_key: "project_id", dependent: :destroy 
    has_many :users, through: :ownerships 
end 

class User < ActiveRecord::Base 
    attr_accessible :first_name, :last_name, :email, :password, :password_confirmation 

    has_many :ownerships, foreign_key: "user_id", dependent: :destroy 
    has_many :projects, through: :ownerships 
    validates :first_name, presence: true, length: { maximum: 25 } 
    validates :last_name, presence: true, length: { maximum: 25 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, 
     uniqueness: { case_sensitive: false } 
    validates :password, presence: true, length: { minimum: 6 } 
    validates :password_confirmation, presence: true 
end 

class Ownership < ActiveRecord::Base 
    attr_accessible :project_id 

    belongs_to :user, class_name: "User" 
    belongs_to :project, class_name: "Project" 

    validates :user_id, presence: true 
    validates :project_id, presence: true 
end 

는 따라서, 사용자는 먼저 존재해야합니다

이 내가 현재 가지고있는 것입니다. 현재 문제가있는 것은 새 프로젝트를 만들고 새 프로젝트에 사용자를 추가하려고 할 때 사용자가 User 테이블에 이미 있기 때문에 저장하지 못하게하는 것입니다. 보다 구체적으로, 레일 콘솔에서 다음을 작성,

(0.1ms) SAVEPOINT active_record_1 
User Exists (0.1ms) SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('[email protected]') AND "users"."id" != 1) LIMIT 1 
(0.1ms) ROLLBACK TO SAVEPOINT active_record_1 
=> false 

사용자를 기존으로 새 프로젝트를 연결할 수있는 방법이 있나요 :

>> prj = Project.new(prj_id: 'hello', name: 'hello') 
>> usr = User.find_by_id(1) 
>> prj.users<<usr 
>> prj.save 

prj.save 라인은이 메시지를주고 실패 사용자 테이블에 사용자가 있는지 (새 사용자를 만들지 않으려는 경우) 확인하면서 프로젝트 테이블과 소유권 테이블에 새 항목이 있습니까? 감사!

+0

'prj.save'를 호출 한 후'prj.errors'와'usr.errors'를 검사 해보십시오. 오류 메시지가 있습니까? 또한,'Ownership' 테이블/모델은 어떻게 생겼습니까? – rossta

+0

오류는 사용자가 User 테이블에 저장하려고 시도했기 때문에 사용자가 유효하지 않으며 유일성 유효성 검사에 실패 함을 나타냅니다. Ownership은 User 테이블과 Project 테이블의 외래 키로서 각각 user_id와 project_id가있는 테이블 일뿐입니다. 내가 원한 것은 기존 사용자와 새로운 프로젝트를 참조하는 새로운 프로젝트와 새로운 소유권 튜플을 만드는 것입니다. 이미 존재하기 때문에 새 프로젝트와 새로운 소유권 튜플을 저장하려고하지만 사용자는 저장하지 않을 것입니다. – user2292467

+0

소유권 클래스는 어디에 있습니까? 유효성 검사가 있습니까? – Fred

답변

0

프로젝트의 소유권 레코드는 project_id (새 프로젝트의 경우 nil)이 있어야하기 때문에 유효하지 않습니다. 프로젝트를 먼저 생성하거나 Ownership 모델에서 유효성 검사를 변경해야합니다. 당신은 오류를 검사하여이 문제를 볼 수 있습니다

가 포함 된 모델의 객체 :

> prj.errors.full_messages 
=> ["Ownerships is invalid"] 
> prj.ownerships.first.errors.full_messages 
=> ["Project can't be blank"] 
+0

저는 원자 적으로 할 수있는 방법을 실제로 찾고 있습니다. 그래서 하나가 실패하면 다른 것도 실패합니다. 시스템이 소유권 튜플을 어떻게 든 생성하지 못한다면 나는 매달린 프로젝트를 좋아하지 않을 것이다. – user2292467

+0

개인적으로 Ownership에서'user_id'와'project_id'의 유효성을 검사하지 않습니다. 이것들은 소유권이 생성되는 것을 막는 유일한 제한이며, Rails가 협회를 통해 당신을 위해 창작을 다루고 있기 때문에 실제로는 당신을 많이 얻지 못합니다. 유효성 검사는 사용자가 수정할 수있는 경우에 유용합니다 ... 귀하의 경우 소유권을 직접 편집하는 것으로 보이지 않습니다. – rossta

0

가에 ownership 클래스에 검증을 변경해보십시오

validates :user, presence: true 
validates :project, presence: true 

확실하지 경우 실제 검증의 구별 협회 (project) 대 id (project_id)는 차이를 만들지 만 시험해 볼 가치가 있습니다. 즉, 프로젝트 측에서 연관을 생성하는 경우 (프로젝트는 항상 사용자가 있어야하지만 다른 방법은 필요하지 않음) 비즈니스 규칙에 따라 이 실제로이라는 사용자 지정 유효성 검사가 필요하다는 소리가 들립니다.

관련 문제