Несколько ссылок из одной таблицы - PullRequest
1 голос
/ 12 июля 2011

Я видел эту проблему несколько раз, но ничего слишком полного. У меня проблема с использованием таблицы соединений для одной модели. Например, предположим, у нас есть пользователи и Highfives. Highfives будет просто таблицей соединений для двух пользователей highfiving. Итак, у меня есть это:

class Highfive < ActiveRecord::Base
  belongs_to :user1,
             :class_name => "User"

  belongs_to :user2,
             :class_name => "User"
end

class User < ActiveRecord::Base
  has_many :highfives
end

Однако, с этим я не могу сделать что-то вроде User.find (1) .highfives, так как это генерирует запрос вроде:

SELECT "highfives".* FROM "highfives" WHERE "highfives"."user_id" = 1

Действительно, я должен получить запрос вроде:

SELECT "highfives".* FROM "highfives" WHERE "highfives"."user1_id" = 1 or "highfives"."user2_id" = 1

Я полагаю, что для этого мне нужно каким-то образом изменить мою модель пользователя. Но чего мне не хватает?

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Вам необходимо указать внешний ключ в вашем операторе has_many, в противном случае Rails примет это user_id:

class User < ActiveRecord::Base
  has_many :highfives, :foreign_key => :user1_id
end

Конечно, это работает только для одного внешнего ключа. В вашем случае вы, вероятно, захотите использовать метод экземпляра:

class User < ActiveRecord::Base
  def highfives
    Highfive.where("user1_id = ? or user2_id = ?", id, id)
  end
end

Или, предполагая, что User не сможет выжить сам:

class User < ActiveRecord::Base
  has_many :highfives1, :class => "Highfive", :foreign_key => :user1_id
  has_many :highfives2, :class => "Highfive", :foreign_key => :user2_id
  def highfives
    highfives1 + highfives2
  end
end
0 голосов
/ 12 июля 2011

Укажите :foreign_key в ваших моделях. Так ..

class Highfive < ActiveRecord::Base
  belongs_to :user1,
             :class_name => "User",
             :foreign_key => "user1_id"

  belongs_to :user2,
             :class_name => "User",
             :foreign_key => "user2_id"
end

class User < ActiveRecord::Base
  has_many :highfive1, 
           :class_name => "Highfive",
           :foreign_key => "highfive1_id"
  has_many :highfive2, 
           :class_name => "Highfive",
           :foreign_key => "highfive2_id"
end

Ссылка!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...