두 개의 클래스 사용자 및 프로젝트가 있습니다. 사용자는 많은 프로젝트를 소유 할 수 있으며 많은 사용자가 프로젝트를 소유 할 수 있습니다. 그러나 프로젝트에는 최소한 하나의 사용자가 있어야하며 사용자는 프로젝트를 가질 필요가 없습니다. 우리가 프로젝트를 생성하기 전에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 라인은이 메시지를주고 실패 사용자 테이블에 사용자가 있는지 (새 사용자를 만들지 않으려는 경우) 확인하면서 프로젝트 테이블과 소유권 테이블에 새 항목이 있습니까? 감사!
'prj.save'를 호출 한 후'prj.errors'와'usr.errors'를 검사 해보십시오. 오류 메시지가 있습니까? 또한,'Ownership' 테이블/모델은 어떻게 생겼습니까? – rossta
오류는 사용자가 User 테이블에 저장하려고 시도했기 때문에 사용자가 유효하지 않으며 유일성 유효성 검사에 실패 함을 나타냅니다. Ownership은 User 테이블과 Project 테이블의 외래 키로서 각각 user_id와 project_id가있는 테이블 일뿐입니다. 내가 원한 것은 기존 사용자와 새로운 프로젝트를 참조하는 새로운 프로젝트와 새로운 소유권 튜플을 만드는 것입니다. 이미 존재하기 때문에 새 프로젝트와 새로운 소유권 튜플을 저장하려고하지만 사용자는 저장하지 않을 것입니다. – user2292467
소유권 클래스는 어디에 있습니까? 유효성 검사가 있습니까? – Fred