(Вопрос Rails) Слияние нескольких полиморфных отношений has_many - PullRequest
3 голосов
/ 19 ноября 2010

(это не тот код, который я использую, хотя это подводит итог идеи о том, что я хочу сделать)

class Connection < ActiveRecord::Base
  belongs_to :connection1, :polymorphic => true
  belongs_to :connection2, :polymorphic => true
end

class User < ActiveRecord::Base
  has_many :followers, :class_name => 'Connection', :as => :connection1
  has_many :followings, :class_name => 'Connection', :as => :connection2
end

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

u = User.first
u.network # this will return a merged version of :followings and :followers

Так что я все еще смогу сделать это:

u.network.find_by_last_name("James")

ETA:

Или, хм, я думаю, что мой вопрос действительно сводится к тому, возможно ли создать метод, который объединит 2 ассоциации has_many таким образом, что я все еще могу вызывать его методы find_by.

1 Ответ

0 голосов
/ 24 ноября 2010

Вы уверены, что хотите коллекцию соединений, а не коллекцию пользователей?

Если вам нужен набор Connections, похоже, вы будете хорошо обслуживаться методом класса в Connection (или областью, если вам нравятся такие вещи).

connection.rb

class Connection < ActiveRecord::Base
  class << self
    def associated_with_model_id(model, model_id)
      include([:connection1, :connection2]).
      where("(connection1_type IS #{model} AND connection1_id IS #{model_id})
            OR (connection2_type IS #{model} AND connection2_id IS #{model_id})")
    end
  end
end

user.rb

class User < ActiveRecord::Base
  def network
    Connection.associated_with_model_id(self.class.to_s, id)
  end
end

Возможно, не так полезно, как хотелось бы, но, возможно, это даст вам некоторые идеи.

...