Railsy ma wiele z nazwą aliasu

186

W moim modelu użytkownika mógłbym:

has_many :tasks

i w moim modelu zadań:

belongs_to :user

Następnie, zakładając, że klucz obcy „user_id” został zapisany w tabeli zadań, mógłbym użyć:

@user.tasks

Moje pytanie brzmi: w jaki sposób mogę zadeklarować relację has_many, aby móc odwoływać się do zadań użytkownika jako:

@user.jobs

... lub ...

@user.foobars

Dzięki kupie.

doktorantange
źródło
7
Byłbym zmęczony używaniem Zadania jako nazwy klasy - jest to słowo zarezerwowane dla Railsów i może powodować dziwne problemy w przyszłości: zastrzeżonewords.herokuapp.com
Joshua Pinter

Odpowiedzi:

361

Daj temu szansę:

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

Uwaga: :assłuży do skojarzeń polimorficznych .

Sam Saffron
źródło
1
Dziękuję również za uwzględnienie klucza obcego - rozwiązałem mój podobny, ale inny problem.
Niels Abildgaard,
4
Czy to wymaga czegoś specjalnego po stronie Zadania, czy zwykle belongs_towystarcza?
jasna gwiazda
1
FYI: działa to również w przypadku asocjacji has_and_belongs_to_many, nie ma potrzeby tworzenia fragmentu „Foreign_key”
David Moritz
55

Możesz także użyć, alias_attributejeśli nadal chcesz nazywać je również zadaniami:

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

  has_many :tasks
end
Pwnrar
źródło
3

Aby wypełnić odpowiedź @ SamSaffron:

Możesz używać class_namez jednym foreign_keylub inverse_of. Ja osobiście wolę bardziej abstrakcyjną deklarację, ale tak naprawdę to tylko kwestia gustu:

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

i musisz upewnić się, że masz belongs_toatrybut w modelu potomnym:

class BlogPostImage
  belongs_to :blog_post
end
Ghis
źródło
0

Jeśli używasz has_many, i chcesz uzyskać alias:

has_many :alias_name, through: model_name, source: initial_name
A. Askarov
źródło
-61

Możesz to zrobić na dwa różne sposoby. Jednym z nich jest użycie „as”

has_many :tasks, :as => :jobs

lub

def jobs
     self.tasks
end

Oczywiście pierwszy byłby najlepszym sposobem na poradzenie sobie z tym.

Brent Kirby
źródło
Dzięki, to brzmi idealnie. Niestety to nie zadziałało: MODEL UŻYTKOWNIKA: has_many: zadania,: as =>: utworzone_zadania KONTROLER: @tworzone_zadania = @ użytkownik.tworzone_zadania ----- NoMethodError w TasksController # indeks niezdefiniowana metoda `utworzono_zadania dla # <Użytkownik: 0xb6050b5c>
doctororange
4
Druga metoda jest w rzeczywistości całkiem przydatna do utworzenia aliasu skojarzenia.
jpgeek
Nie wydaje się to właściwe, jak powiedział Sam, ponieważ: dotyczy skojarzeń polimorficznych.
Michael K Madison