Как сделать так, чтобы два столбца в одной таблице указывали на один и тот же столбец в другой с помощью ActiveRecord?

Здесь я рискую столкнуться ладонью со лбом, но не могу понять, как это сделать с сахаром ActiveRecord в Rails.

У меня есть таблица tickets с двумя столбцами (submitter_id и assignee_id), каждый из которых должен ссылаться на другого пользователя из таблицы users (в частности, на столбец id в таблице users). Я хотел бы иметь возможность делать такие вещи, как ticket.submitter.name и ticket.assignee.email, используя ассоциации ActiveRecord. Submitter и Assignee — это просто пользовательские объекты с разными ассоциативными именами.

Единственное, что я нашел, что близко к тому, что я делаю, это использование полиморфных ассоциаций, но в конце концов я почти уверен, что это не совсем то, что мне нужно. Я не собираюсь использовать несколько типов, и отправитель, и правопреемник будут пользователями, и вполне может быть двумя разными пользователями.

Любая помощь была бы фантастической. Спасибо!


person localshred    schedule 10.12.2009    source источник


Ответы (2)


class Ticket < ActiveRecord::Base
  belongs_to :submitter, :class_name => "User"
  belongs_to :assignee, :class_name => "User"
end

Должно сработать.

Изменить: не попробовав, я не уверен, нужен ли вам параметр :foreign_key или нет. Мой инстинкт - нет, но это не повредит.

Редактировать еще раз: Извините, остановились на ассоциациях «Пользователь» -> «Заявка». Вы не упомянули об их использовании, и я обычно добавляю ассоциации только в одном направлении, если не планирую использовать их в другом направлении.

В любом случае, попробуйте:

class User < ActiveRecord::Base
  has_many :assigned_tickets, :class_name => "Ticket", :foreign_key => "assignee_id"
  has_many :submitted_tickets, :class_name => "Ticket", :foreign_key => "submitter_id"
end
person PreciousBodilyFluids    schedule 10.12.2009
comment
Определенно момент ладонь ко лбу. Я знал, что это было там, но я не мог получить доступ к этому фрагменту памяти, я думаю. Спасибо, что помогли мне здесь! - person localshred; 10.12.2009

Что-то вроде этого должно работать

class Ticket < ActiveRecord::Base
  belongs_to :submitter, :class_name => 'User', :foreign_key => 'submitter_id'
  belongs_to :assignee,  :class_name => 'User', :foreign_key => 'assignee_id'
end

class User < ActiveRecord::Base
  has_many :tickets, :class_name => 'Ticket', :foreign_key => 'submitter_id'
  has_many :tickets_assigned,  :class_name => 'Ticket', :foreign_key => 'assignee_id'
end

Да, PreciousBodilyFluids прав, нам не нужно указывать foreign_key в классе Ticket, поскольку rails может вывести его из имени столбца, то есть submitter_id и assignee_id

Но если имя вашей ассоциации отличается от column_name_{id}, вам придется указать его, т.е. случай класса User

person nas    schedule 10.12.2009
comment
Внешний ключ необязателен в объявлении own_to, если он может быть получен из имени ассоциации. - person EmFi; 10.12.2009
comment
Вы правы, поэтому я и упомянул об этом в своем ответе :) - person nas; 11.12.2009