Rails has_many з псевдонімом


186

У своїй моделі користувача я міг:

has_many :tasks

і в моїй моделі завдань:

belongs_to :user

Тоді, припустивши, що зовнішній ключ 'user_id' зберігається в таблиці завдань, я міг би використовувати:

@user.tasks

Моє запитання полягає в тому, як я можу оголосити відносини has_many таким чином, щоб я міг посилатися на завдання Користувача як:

@user.jobs

... або ...

@user.foobars

Дякую купу.


7
Я б втомився від використання завдання в якості імені класу - це Rails зарезервоване слово і може викликати дивні проблеми вниз по дорозі: reservedwords.herokuapp.com
Джошуа Пінтер

Відповіді:


361

Спробуйте:

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

Зауважте, що :asвикористовується для поліморфних асоціацій .


1
Дякую, що ви також включили зовнішній ключ - вирішили мою подібну, але іншу проблему.
Niels Abildgaard

4
Чи потрібно для цього щось особливе на стороні Завдання чи belongs_toдостатньо звичайного ?
яскрава зірка

1
FYI: це також працює для has_and_belongs_to_many об'єднань, тільки немає необхідності в "іноземній ключі" шматок
Девід Моріц

55

Ви також можете використовувати, alias_attributeякщо ви все ще хочете мати можливість посилатися на них як на завдання:

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

  has_many :tasks
end

3

Щоб заповнити відповідь @ SamSaffron:

Ви можете використовувати class_nameз будь-яким foreign_keyабо inverse_of. Я особисто віддаю перевагу більш абстрактним декларативним, але це справді лише питання смаку:

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

і вам потрібно переконатися, що у вас є belongs_toатрибут на дочірній моделі:

class BlogPostImage
  belongs_to :blog_post
end

0

Якщо ви використовуєте has_many через та хочете отримати псевдонім:

has_many :alias_name, through: model_name, source: initial_name

-61

Ви могли зробити це двома різними способами. Перший - за допомогою "як"

has_many :tasks, :as => :jobs

або

def jobs
     self.tasks
end

Очевидно, що перший був би найкращим способом впоратися з цим.


Дякую, це звучить ідеально. На жаль, це не спрацювало: USER MODEL: has_many: task,: as =>: created_tasks CONTROLLER: @create_tasks = @ user.create_tasks ----- NoMethodError в TasksController # індекс не визначений метод `created_tasks 'для # <Користувача: 0xb6050b5c>
doctororange

4
Другий метод насправді досить корисний для створення псевдоніма асоціації.
jpgeek

Це, здається, не підходить, як сказав Сем, як: для поліморфних асоціацій.
Майкл К Медісон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.