Rails has_many với tên bí danh


186

Trong mô hình Người dùng của tôi, tôi có thể có:

has_many :tasks

và trong mô hình Nhiệm vụ của tôi:

belongs_to :user

Sau đó, giả sử khóa ngoại 'user_id' được lưu trong bảng tác vụ, tôi có thể sử dụng:

@user.tasks

Câu hỏi của tôi là, làm cách nào để khai báo mối quan hệ has_many để tôi có thể tham khảo Nhiệm vụ của người dùng như:

@user.jobs

... hoặc là ...

@user.foobars

Cảm ơn một đống.


7
Tôi cảm thấy mệt mỏi khi sử dụng Nhiệm vụ làm tên lớp - đó là một từ dành riêng cho Rails và có thể gây ra sự cố lạ lùng: reservedwords.herokuapp.com
Joshua Pinter

Câu trả lời:


361

Cung cấp cho một shot:

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

Lưu ý, đó :asđược sử dụng cho các hiệp hội đa hình .


1
Cảm ơn bạn cũng bao gồm khóa ngoại - đã giải quyết vấn đề tương tự nhưng khác biệt của tôi.
Niels Abildgaard

4
Điều này cần bất cứ điều gì đặc biệt ở phía Nhiệm vụ hay là belongs_tođủ thông thường ?
ngôi sao sáng

1
FYI: điều này cũng hoạt động cho các hiệp hội has_and_belongs_to_many, chỉ không cần phần "Foreign_key"
David Moritz

55

Bạn cũng có thể sử dụng alias_attributenếu bạn vẫn muốn có thể coi chúng là các nhiệm vụ:

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

  has_many :tasks
end

3

Để hoàn thành câu trả lời của @ SamSaffron:

Bạn có thể sử dụng class_namevới một trong hai foreign_keyhoặc inverse_of. Cá nhân tôi thích khai báo trừu tượng hơn, nhưng nó thực sự chỉ là vấn đề của hương vị:

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

và bạn cần chắc chắn rằng bạn có belongs_tothuộc tính trên mô hình con:

class BlogPostImage
  belongs_to :blog_post
end

0

Nếu bạn sử dụng has_many thông qua và muốn bí danh:

has_many :alias_name, through: model_name, source: initial_name

-61

Bạn có thể làm điều này theo hai cách khác nhau. Một là bằng cách sử dụng "như"

has_many :tasks, :as => :jobs

hoặc là

def jobs
     self.tasks
end

Rõ ràng người đầu tiên sẽ là cách tốt nhất để xử lý nó.


Cảm ơn, điều đó nghe thật hoàn hảo. Thật không may, điều này không hoạt động: MODEL NGƯỜI DÙNG: has_many: task ,: as =>: created_t Nhiệm CONTROLLER: @created_t Nhiệm = @ user.created_t Nhiệm ----- NoMethodError trong T taskContoder # index không xác định phương thức `created_t Nhiệm 'cho # <Người dùng: 0xb60
Doctororange

4
Phương pháp thứ hai thực sự khá hữu ích để tạo bí danh của hiệp hội.
jpgeek

Điều này dường như không phù hợp, như Sam nói, như: dành cho các hiệp hội đa hình.
Michael K Madison
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.