Rails has_many mit Aliasnamen

186

In meinem Benutzermodell könnte ich haben:

has_many :tasks

und in meinem Aufgabenmodell:

belongs_to :user

Angenommen, der Fremdschlüssel 'user_id' wurde in der Aufgabentabelle gespeichert, könnte ich Folgendes verwenden:

@user.tasks

Meine Frage ist, wie deklariere ich die Beziehung has_many so, dass ich auf die Aufgaben eines Benutzers verweisen kann als:

@user.jobs

... oder ...

@user.foobars

Vielen Dank.

Doktororange
quelle
7
Ich wäre es leid, Task als Klassennamen zu verwenden - es ist ein reserviertes Wort von Rails und könnte später seltsame Probleme verursachen: reservedwords.herokuapp.com
Joshua Pinter

Antworten:

361

Probieren Sie es aus:

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

Beachten Sie, dass dies :asfür polymorphe Assoziationen verwendet wird .

Sam Safran
quelle
1
Vielen Dank, dass Sie auch den Fremdschlüssel hinzugefügt haben - mein ähnliches, aber unterschiedliches Problem wurde gelöst.
Niels Abildgaard
4
Benötigt dies etwas Besonderes auf der Aufgabenseite oder ist das Übliche belongs_toausreichend?
Heller Stern
1
Zu Ihrer Information: Dies funktioniert auch für has_and_belongs_to_many Assoziationen, nur keine Notwendigkeit für das Stück "Foreign_key"
David Moritz
55

Sie können auch verwenden, alias_attributewenn Sie sie weiterhin als Aufgaben bezeichnen möchten:

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

  has_many :tasks
end
Pwnrar
quelle
3

Um die Antwort von @ SamSaffron zu vervollständigen:

Sie können class_nameentweder foreign_keyoder verwenden inverse_of. Ich persönlich bevorzuge die abstraktere Deklaration, aber es ist wirklich nur eine Frage des Geschmacks:

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

und Sie müssen sicherstellen, dass Sie das belongs_toAttribut für das untergeordnete Modell haben:

class BlogPostImage
  belongs_to :blog_post
end
Ghis
quelle
0

Wenn Sie has_many verwenden und einen Alias ​​verwenden möchten:

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

Sie können dies auf zwei verschiedene Arten tun. Eine ist die Verwendung von "as"

has_many :tasks, :as => :jobs

oder

def jobs
     self.tasks
end

Offensichtlich wäre der erste der beste Weg, damit umzugehen.

Brent Kirby
quelle
Danke, das klingt perfekt. Leider hat dies nicht funktioniert: USER MODEL: has_many: task ,: as =>: created_tasks CONTROLLER: @created_tasks = @ user.created_tasks ----- NoMethodError in TasksController # index undefinierte Methode `created_tasks 'für # <User: 0xb6050b5c>
Doctororange
4
Die zweite Methode ist tatsächlich sehr nützlich, um einen Alias ​​der Assoziation zu erstellen.
Jpgeek
Dies scheint nicht angemessen zu sein, wie Sam sagte, da: für polymorphe Assoziationen.
Michael K Madison