2012-05-05 2 views
1

사용자 및 작업 모델간에 관계가 다 대다가 있습니다.레일 : 생성 중 모델 속성 채우기

작업에는 많은 사용자가있을 수 있지만 사용자가 @user.tasks.create으로 작업자를 만든 경우 원래 작성자를 추적해야합니다. 내가 어떻게 할 수 있는지 궁금해서.

작업 테이블에 "creator"라는 새로운 열 필드를 만들어야합니다. 그때 나는 다음과 같은 방법으로 작업을 initalise 수 :

@user.tasks.create(:creator=>@user) 

창조자는 항상 작업을 인스턴스화 사용자되기 때문에 인수를 추가 할 필요하지 않는 방법이 있나요.

감사합니다.

편집

내 사용자 모델이 있습니다

has_many :taskization 
has_many :tasks, :through => :taskization 

내 작업 모델이 있습니다

has_many :taskization 
    has_many :users, :through => :taskization 
+0

모델 코드를 공유 할 수 있습니까? –

+0

내 모델에는 기본적으로 다 대다 관계 만 있습니다 ...이 질문을 표시하도록 업데이트했습니다. 그러나 이것은 잠시 동안 어떻게해야하는지 궁금해 왔기 때문에 일반적인 질문에 가깝습니다. 응용 프로그램과 직접적인 관련이 없습니다. – Karan

답변

1

'original_creator'가 작업의 속성임을 나타내는 것처럼 들립니다. 각 작업 레코드에 대해 사용자가 원래 만든 레코드를 추적하고 싶습니다. 그래서

, 둘 다 필요 것 같아 모델링 :

# return the User object of the original task creator 
@original_creator_user = @task.original_creator 

뿐만 아니라

# get all users of this task 
@users = @task.users 

작동 할 수 있습니다.

이 경우 Task 개체와 User 개체의 두 가지 다른 관계가 필요합니다. '창조자'의 관계가 :through 작업 아니라고

class User < ActiveRecord::Base 
    # tasks for this user 
    has_many :taskization 
    has_many :tasks, :through => :taskization 

    # tasks this user was the original creator of 
    has_many :created_tasks, :class_name => "Task" 

end 

class Task < ActiveRecord::Base 
    # users of this task 
    has_many :taskization 
    has_many :users, :through => :taskization 

    # user who originally created this class 
    belongs_to :original_creator, :class_name => "User" 

end 

주의, 그것은 두 개체 사이의 직접 관계입니다.

+0

케빈, 대답 해줘서 고마워. 빠른 질문, Steve의 답변도 해당됩니까? – Karan

+0

다른 접근 방법이 있지만, 위의 연관성을 충분히 추가해야한다고 생각합니다. 감사! –

+1

@Kevin - 크리에이터 속성에 액세스하는 데 연관이 필요하지는 않지만 콜백이 없으면 처음에는 그 속성의 값이'@ user.tasks.create (: creator => @ 사용자)'작업이 생성되면? 그 부분은 나에게 분명하지 않다. –

2

나는 결합 모델 (Taskization)에서 작성자 속성을 넣어하는 경향이 있어요. 당신이

class AddCreatorIdToTaskizations < ActiveRecord::Migration 
    def change 
    add_column :taskizations, :creator_id, :integer 
    end 
end 

당신이 다음 추가 할 수 있습니다 (예를 들어,이 마이그레이션에) 그렇게한다면 콜백 당신이 원하는 어디를 얻을 수

before_create do |taskization| 
    taskization.creator_id = taskization.user_id 
end 

을 taskization.rb합니다. 작업 모델에서 작성자 특성이 속한 위치를 결정하면 비슷한 콜백을 수행 할 수도 있지만 완전히 생각하지는 못합니다.

+0

Kevin의 답변은 새로운 연결을 만들 필요성에 관한 것입니다. 읽은 것을 바탕으로, 당신이 묻는 바를 기반으로, 그 속성을 Task 모델에 넣는 것이 합리적이라고 생각합니다.그렇게하기 위해서는 작업에 creator_id 열을 추가하고 Task 객체에서 콜백을 설정하고 Kevin의 답변 라인을 따라 관계를 설정하십시오. 조인 모델에서 설정하는 유일한 이점은 모든 사용자가 so-and-so로 작성한 작업을 수행하도록하려는 경우입니다. 이를 가능하게하기 위해서는 또 다른 연관성을 설정해야합니다. –

+0

훌륭합니다 - 답변 해 주셔서 감사합니다. 나는 케빈의 대답이 내 질문에 직접 관련이 있다고 생각한다. (내가 틀렸다면 나에게 맞춰라.) -하지만 당신의 대답으로 나는 조인 테이블이 작업과 사용자 사이의 각 관계에 대한 정보를 유지할 수 있음을 알았다. . 무리 감사! – Karan