Привязка Rails к той же модели

#ruby-on-rails #ruby-on-rails-3 #activerecord

#ruby-on-rails #ruby-on-rails-3 #activerecord

Вопрос:

Допустим, у меня есть 2 таблицы:

 Users
user_id name

Tags
tagger_id tagged_id
  

Это описывает ситуацию, когда вы можете

И модели, которые я пытаюсь настроить, являются:

 class User < ActiveRecord::Base
    has_many :tags, :foreign_key => "tagger_id"
end

class Tag < ActiveRecord::Base
    belongs_to :tagger, :class => "User"
    belongs_to :tagged, :class => "User"
end
  

Я пытаюсь настроить это так, чтобы, когда я делаю:

 user.tags
  

Он возвращается со списком пользовательских объектов. При моей текущей настройке он возвращается только с фактической записью тега с идентификаторами вместо объектов. Как мне настроить его, чтобы он возвращал список пользовательских объектов?

Я пытался использовать:

 has_many :tags, :foreign_key => "tagger_id", :source => :tagged
  

Но это не сработало.

Комментарии:

1. user.tags предполагается, что вы получаете теги, а не пользователей… Вы говорите ему «Дайте мне все теги для этого пользователя». Можете ли вы уточнить, какой именно список пользователей вы ожидаете?

Ответ №1:

Вы ищете has_many :through .

 class User < ActiveRecord::Base
    has_many :tags, :foreign_key => "tagger_id"
    has_many :tagged, :through => :tags
end
  

Затем user.tagged должен быть предоставлен список пользователей, которых вы хотите.

Комментарии:

1. Спасибо! Это было просто. Есть ли какой-нибудь способ вернуть вместо этого имя «tags», чтобы я мог использовать user.tags вместо user.tagged для него? Имеет лучшее звучание для этого 🙂

2. Я бы согласился с Max — теги — это теги, а не пользователи. Если вы хотите, вы, вероятно, могли бы определить метод «tags», но я действительно не вижу в этом смысла.