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.


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 .


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

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

0

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

has_many :alias_name, through: model_name, source: initial_name

-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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.