Rails has_many dengan nama alias

186

Dalam model Pengguna saya, saya dapat memiliki:

has_many :tasks

dan dalam model Tugas saya:

belongs_to :user

Kemudian, seandainya kunci asing 'user_id' disimpan di tabel tugas, saya bisa menggunakan:

@user.tasks

Pertanyaan saya adalah, bagaimana cara menyatakan hubungan has_many sehingga saya bisa merujuk ke Tugas Pengguna sebagai:

@user.jobs

... atau ...

@user.foobars

Terima kasih banyak.

doctororange
sumber
7
Saya akan lelah menggunakan Task sebagai nama kelas - itu adalah kata Rails reserved dan dapat menyebabkan masalah aneh di ujung jalan: reservedwords.herokuapp.com
Joshua Pinter

Jawaban:

362

Coba ini:

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

Catatan, yang :asdigunakan untuk asosiasi polimorfik .

Sam Saffron
sumber
1
Terima kasih telah memasukkan kunci asing - memecahkan masalah saya yang serupa tetapi berbeda.
Niels Abildgaard
4
Apakah ini memerlukan sesuatu yang khusus di sisi Tugas atau apakah belongs_tocukup memadai?
Bintang terang
1
FYI: ini juga berfungsi untuk asosiasi has_and_belongs_to_many, hanya saja tidak perlu untuk bagian "foreign_key"
David Moritz
55

Anda juga dapat menggunakan alias_attributejika Anda masih ingin merujuknya sebagai tugas juga:

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

  has_many :tasks
end
Pwnrar
sumber
3

Untuk melengkapi jawaban @SamSaffron:

Anda dapat menggunakan class_namesalah satu foreign_keyatau inverse_of. Saya pribadi lebih suka deklaratif yang lebih abstrak, tapi itu benar-benar hanya masalah selera:

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

dan Anda perlu memastikan Anda memiliki belongs_toatribut pada model anak:

class BlogPostImage
  belongs_to :blog_post
end
Ghis
sumber
0

Jika Anda menggunakan has_many melalui, dan ingin alias:

has_many :alias_name, through: model_name, source: initial_name
A. Askarov
sumber
-61

Anda dapat melakukan ini dengan dua cara berbeda. Salah satunya adalah dengan menggunakan "sebagai"

has_many :tasks, :as => :jobs

atau

def jobs
     self.tasks
end

Jelas yang pertama akan menjadi cara terbaik untuk menanganinya.

Brent Kirby
sumber
Terima kasih, itu terdengar sempurna. Sayangnya ini tidak berhasil: MODEL PENGGUNA: has_many: tugas,: as =>: Created_tasks CONTROLLER: @created_tasks = @ user.created_tasks ----- NoMethodError di TasksController # index undefined method `Created_tasks 'untuk # <Pengguna: 0xb6050b5c>
doctororange
4
Metode kedua sebenarnya cukup berguna untuk membuat alias dari asosiasi.
jpgeek
Ini sepertinya tidak sesuai, seperti kata Sam, seperti: adalah untuk asosiasi polimorfik.
Michael K Madison