2009-07-22 2 views
155

В моей модели User я мог бы:Рельсы has_many с псевдонимом

has_many :tasks 

и в моей целевой модели:

belongs_to :user 

Тогда, предполагая, что внешний ключ «user_id» был сохранен в задачах стол, я мог бы использовать:

@user.tasks 

Мой вопрос, как я могу объявить отношения has_many таким образом, что я могу сослаться на задачи пользователя, как:

@user.jobs 

... или ...

@user.foobars 

Благодаря кучу.

+7

Я бы устал от использования задачи в качестве имени класса - это Rails зарезервированное слово и может вызвать странные проблемы в будущем: http://reservedwords.herokuapp.com/ –

+0

У меня была такая же проблема @doctororange! –

ответ

303

Дайте этот выстрел:

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

Обратите внимание, что :as используется для polymorphic associations.

+0

Спасибо за то, что вы также включили внешний ключ - решили мою подобную, но другую проблему. –

+2

Нужно ли это что-то особенное на стороне задачи или достаточно обычного 'принадлежит_to'? –

-49

Вы могли бы сделать это двумя разными способами. Один из них с помощью «как»

has_many :tasks, :as => :jobs 

или

def jobs 
    self.tasks 
end 

Очевидно, что первый из них будет лучший способ справиться с этим.

+0

Спасибо, это звучит идеально. К сожалению, это не сработало: ПОЛЬЗОВАТЕЛЯ МОДЕЛЬ: HAS_MANY: задачи,: а =>: created_tasks CONTROLLER: @created_tasks = @ user.created_tasks ----- NoMethodError в TasksController # индекс undefined method 'created_tasks 'для # <Пользователь: 0xb6050b5c> – doctororange

+35

: как используется для полиморфных ассоциаций, не для этой конкретной проблемы ... –

+3

Второй метод действительно полезен для создания псевдонима ассоциации. – jpgeek

25

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

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

    has_many :tasks 
end