별명 이름을 가진 Rails has_many


186

내 사용자 모델에서는 다음을 가질 수 있습니다.

has_many :tasks

내 작업 모델에서

belongs_to :user

그런 다음 외래 키 'user_id'가 작업 테이블에 저장되어 있다고 가정하면 다음을 사용할 수 있습니다.

@user.tasks

내 질문은 사용자 작업을 다음과 같이 참조 할 수 있도록 has_many 관계를 어떻게 선언합니까?

@user.jobs

... 또는 ...

@user.foobars

고마워요.


7
Task를 클래스 이름으로 사용하는 데 지쳤습니다. Rails 예약어이므로 길에서 이상한 문제가 발생할 수 있습니다. reservedwords.herokuapp.com
Joshua Pinter

답변:


361

이 기회를주세요 :

has_many :jobs, foreign_key: "user_id", class_name: "Task"

참고 :as에 사용되는 다형성 협회 .


1
외래 키도 포함시켜 주셔서 감사합니다. 비슷하지만 다른 문제가 해결되었습니다.
Niels Abildgaard

4
이것은 작업 측면에서 특별한 것이 필요합니까, 아니면 평소에 belongs_to충분합니까?
밝은 별

1
참고 : 이것은 또한 has_and_belongs_to_many 협회에도 적용되며 "foreign_key"작품이 필요하지 않습니다
David Moritz

55

alias_attribute여전히 작업으로 참조 할 수있는 경우 에도 사용할 수 있습니다.

class User < ActiveRecord::Base
  alias_attribute :jobs, :tasks

  has_many :tasks
end

3

@SamSaffron의 답변을 완료하려면 :

당신은 사용할 수 있습니다 class_name중 하나와 foreign_keyinverse_of. 개인적으로보다 추상적 인 선언을 선호하지만 실제로는 맛의 문제 일뿐입니다.

class BlogPost
  has_many :images, class_name: "BlogPostImage", inverse_of: :blog_post  
end

belongs_to하위 모델에 속성 이 있는지 확인해야합니다 .

class BlogPostImage
  belongs_to :blog_post
end

0

has_many through를 사용하고 별명을 지정하려는 경우 :

has_many :alias_name, through: model_name, source: initial_name

-61

이 두 가지 방법으로 할 수 있습니다. 하나는 "as"를 사용하는 것입니다

has_many :tasks, :as => :jobs

또는

def jobs
     self.tasks
end

분명히 첫 번째 방법이 가장 좋은 방법입니다.


고마워요, 완벽하게 들립니다. 불행히도 이것은 작동하지 않았습니다. USER MODEL : has_many : tasks, : as => : created_tasks CONTROLLER : @created_tasks = @ user.created_tasks ----- TasksController의 NoMethodError # index undefined 메소드`created_tasks 'for # <User : 0xb6050b5c>
doctororange

4
두 번째 방법은 실제로 연결 별칭을 만드는 데 매우 유용합니다.
jpgeek

Sam이 말했듯이 이것은 다형성 연관성에 대해서는 적절하지 않은 것 같습니다.
마이클 K 매디슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.