2010-11-19 3 views
3

(Это не фактический код, я использую, хотя это подводит итог о том, что я хочу сделать)(Rails) Вопрос Объединение несколько полиморфного has_many отношения

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.

+0

На каком языке это? –

+0

К сожалению, извините. Это для Ruby on Rails. – odina

+0

Можете ли вы представить структуру таблицы? , Я не очень понимаю, вопрос ... Вы ищете себе присоединиться? – Rakesh

ответ

0

Вы уверены, что хотите найти коллекцию 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 

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

Смежные вопросы