2012-06-24 6 views
1

프로젝트, 작업 및 하위 작업과 관련된 3 가지 모델이 있습니다.클래식 조인 테이블이없는 많은 관계가 있음

프로젝트에는 많은 작업이 있으며 작업에는 많은 하위 작업이 있습니다. 따라서 작업은 프로젝트에 속하며 하위 작업은 작업에 속합니다.

지금 프로젝트와 하위 작업 간에는 직접 연결이 없습니다. 하나 만들고 싶습니다. @ some_project.subtasks & @ some_subtask.project와 같은 것들에 접근 할 수 있습니다. 하위 마이 그 레이션에 project_id 필드를 추가하지 말고 프로젝트 및 하위 작업 (작업에 이미 project_id 열과 하위 작업과 has_many 관계가 있으므로) 간의 일종의 '연결'로 작업 모델을 사용합니다.

나는 프로젝트 has_many를 작성하여 시작 : 하위 : 통한 => : 작업하위의 belongs_to : 프로젝트.

프로젝트 모델에 하위 작업 메서드가 있는데, @ some_subtask.project를 쓸 때 항상 항상 0이됩니다. 또한 @ some_project.subtasks에서 범위 지정을 사용하면 항상 '모호한 열 이름'오류가 발생합니다.

내가 내 관계를 잘못했기 때문에 이라고 생각합니다. 어떻게해야할까요? 또한 하위 타스크 마이그레이션 파일에 project_id 필드를 추가하는 것이 더 나은 솔루션 (또는 완전히 다른 무언가)이라면 꼭 알려주십시오.

편집 : 여기에 열 이름 오류를 반환 범위이다 나는 시도

10 # SCOPING 
11 def self.included(base) 
12 
13  today = Date.today 
14  start_of_day = DateTime.new(today.year, today.month, today.day, 0, 0, 1) 
15  end_of_day = DateTime.new(today.year, today.month, today.day+1, 0, 0, 0) 
16 
17  base.class_eval do 
18  scope :not_targeted, where(:target => nil) 
19  scope :targeted, where("target IS NOT ?", nil) 
20  scope :targeted_today, where("target > ? AND target < ?", start_of_day, end_of_day) 
21  scope :targeted_after_today, where("target > ?", end_of_day) 
22  scope :overdue, where("target < ?", start_of_day) 
23  end 
24 
25 end 

그 반환 오류 (내가 그들을 lib 디렉토리/폴더에있다가, 그것은 작업 및 하위 모델에 포함 된 모듈이다) 프로젝트 컨트롤러에서 이러한 변수를 정의 할 수 있습니다 (줄 47 및 51은 오류에 대한 책임입니다). 기본적으로 적절한 기록을 전달하고 반환해야합니다.

1 class Task < ActiveRecord::Base 
    2    
    3 include SharedModelCode 
    4 # has scoping and validate method 
    5 
    6 # RELATIONSHIPS   
    7 belongs_to :project  
    8 
    9 has_many :vesicles, :dependent => :destroy 
10 has_many :users, :through => :vesicles, :dependent => :nullify 
11 
12 has_many :subtasks 
13 
14 has_many :discussions, :as => :discussionable, :dependent => :destroy 
15 
16 # VALIDATIONS 
17 validates :project, :presence => true 
18 validates :name, :presence => true, 
19      :length => { :maximum => 50 } 
20 validates :description, :presence => true, 
21       :length => { :maximum => 200, :minimum => 15 } 
22 validate :target_date_cannot_be_in_the_past 
23        
24 # ATTRIBUTE ASSIGNMENT 
25 attr_accessible :name, :description, :target, :completed 
26 
27 # CUSTOM METHODS   
28 def belonging_project  
29  Project.find_by_id(self.project_id) 
30 end      
31 
32 end 
: 여기
1 class Project < ActiveRecord::Base 
    2    
    3 # RELATIONSHIPS   
    4 has_many :synapses, :dependent => :destroy 
    5 has_many :users, :through => :synapses, :dependent => :nullify 
    6 
    7 has_many :tasks, :dependent => :destroy 
    8 has_many :subtasks, :through => :tasks, :dependent => :destroy 
    9 has_many :discussions, :as => :discussionable, :dependent => :destroy 
10 
11 #use this when you don't have callbacks 
12 #has_many :tasks, :dependent => :delete_all 
13 
14 # VALIDATIONS 
15 validates :name, :presence => true, 
16    :length => { :maximum => 50 } 
17 
18 validates :description, :presence => true, 
19       :length => { :maximum => 200, :minimum => 15 } 
20 
21 # ATTRIBUTE ASSIGNMENT 
22 attr_accessible :name, :description 
23 
24 # CUSTOM METHODS   
25 def belonging_project  
26  self     
27 end      
28 
29 end 

이 작업 모델 :이 오류 라인 47 명을 반환 예를 들어

35  @project_tasks = @project.tasks 
36  @project_subtasks = @project.subtasks 

45  @today_tasks = @project_tasks.targeted_today 
46  @today_subtasks = @project_subtasks.targeted_today 
47  @today = @today_tasks + @today_subtasks 
48 
49  @after_today_tasks = @project_tasks.targeted_after_today 
50  @after_today_subtasks = @project_subtasks.targeted_after_today 
51  @after_today = @after_today_tasks + @after_today_subtasks 

... 여기

SQLite3::SQLException: ambiguous column name: target: SELECT "subtasks".* FROM "subtasks" INNER JOIN "tasks" ON "subtasks"."task_id" = "tasks"."id" WHERE "tasks"."project_id" = 1 AND (target > '2012-06-24 00:00:01' AND target < '2012-06-25 00:00:00')

프로젝트 모델입니다

여기에 Subtask mod가 있습니다. 엘 :이 같은

1 class Subtask < ActiveRecord::Base 
    2    
    3 include SharedModelCode 
    4 # has scoping and validate method 
    5 
    6 # RELATIONSHIPS   
    7 belongs_to :task   
    8 belongs_to :project  
    9 
10 has_many :subvesicles, :dependent => :destroy 
11 has_many :users, :through => :subvesicles, :dependent => :nullify 
12 
13 has_many :discussions, :as => :discussionable, :dependent => :destroy 
14 
15 # VALIDATIONS    
16 validates :name, :presence => true 
17 validates :task, :presence => true, 
18      :length => { :maximum => 200 } 
19 validate :target_date_cannot_be_in_the_past 
20 
21 # ATTRIBUTE ASSIGNMENT 
22 attr_accessible :name, :target, :completed 
23 
24 # CUSTOM METHODS   
25 def belonging_project  
26  task = Task.find_by_id(self.task_id) 
27  Project.find_by_id(task.project_id) 
28 end      
29        
30 end 
+1

"모호한 열"- 오류 : 스키마 모양은 어떻습니까? 제가 할 수있는 한'@ project.subtasks'는 잘 작동 할 것입니다. '@ subtask.project'와 마찬가지로 Subtask에'project' 인스턴스 메소드를 추가 할 수 있습니다 :'def project() task.project; 끝 ' – Flambino

+0

좋아, 내가 반환 범위와 오류 메시지를 ... – oFca

+2

참고 자료 레일은'all_xxx'와 같은 메소드로 Time을 확장합니다. 여기서'xxx'는'day','week','month', 'quarter','year'. 결과는 시간 범위입니다. 범위를 다루는 ActiveRecord의 능력과 결합하면'.where (target : Time.now.all_day)'와 같은 일을 할 수 있습니다. – jdoe

답변

2

귀하의 오류 :

SQLite3::SQLException: ambiguous column name: target: SELECT "subtasks".* FROM "subtasks" INNER JOIN "tasks" ON "subtasks"."task_id" = "tasks"."id" WHERE "tasks"."project_id" = 1 AND (target > '2012-06-24 00:00:01' AND target < '2012-06-25 00:00:00')

은 당신이 당신의 관계를 만들지 않은 방법, 당신의 범위를 쓴 방법 때문이다. 그것은 targettaskssubtasks 테이블에있는 열이 있다고합니다.

이 같은 범위는 적어도 그 오류 수정해야 다시 쓰기 : 당신은 다음과 같은 조인 여러 테이블에서 같은 열 이름이있을 때, 당신은 제약 조건이 적용되는 테이블 및 열 지정해야

# tasks targeted today 
scope :tasks_targeted_today, where("tasks.target > ? AND tasks.target < ?", start_of_day, end_of_day) 

# subtasks targeted today 
scope :subtasks_targeted_today, where("subtasks.target > ? AND subtasks.target < ?", start_of_day, end_of_day) 

을 에.

+0

네가 못을 잡았어! 고맙습니다. 따라서이 두 줄을 범위에 추가하면 오늘 대상으로 지정된 모든 작업과 하위 작업의 목록을 얻을 수 있습니까? – oFca

+0

나는 그렇게 믿는다 - 확실하지는 않지만. 좀 더 나아가서 질문을하면 앞으로 나아가고 새로운 질문을 게시하는 것이 좋습니다. 행운을 빕니다! –

0

시도 뭔가 아마도

class Projects < ActiveRecord::Base 
    has_many :tasks 
    has_many :subtasks, :through => :tasks, :foreign_key => "project_id" 
0

당신은 belongs_to 협회에 :trough을 사용할 수 없습니다. 그러나 조부모를 쉽게 정의 할 수 있습니다.

class Subtask < ActiveRecord::Base 
    belongs_to :task 
... 
    def project 
    task.project 
    end 
... 

'모호한 열 이름'오류는 해결하기 위해 더 많은 정보가 필요합니다. 시도한 범위를 첨부 할 수 있습니까?

+0

스코프를 첨부했습니다. 당신이 쓴 코드를 작성해 주시겠습니까? 그 책을 읽는 데 어려움이 있습니다 ... 감사합니다. – oFca

1

다른 테이블을 통해 belongs-to-like 관계가 필요한 경우 has_one을 사용하십시오. 그것의 옵션에 through을 지정할 수 있습니다.

+0

제가 원한대로 고마워했습니다. 저 범위를 통과 시키려면 내가해야 할 일이 뭔지 알아? – oFca

관련 문제