2009-08-05 4 views
0

У меня есть 3 класса, связанные с ассоциациями habtm ... Пользователи, местоположения, сотрудники.Rails: Поиск детей детей в отношениях habtm activerecord

Пользователи связаны с местоположениями через отношения habtm, а местоположения связаны с сотрудниками через отношения habtm.

То, что я хотел бы быть в состоянии сделать, это сказать:

current_user.locations.employees

Кто-нибудь знает «Rails Way», чтобы сделать это? Я могу сделать это в SQL, но мне интересно, есть ли более чистый способ.

+0

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

ответ

1

Вы можете расширить ассоциации в ActiveRecord:

class User 

    has_many :locations do 

    def employees 
     # Use whatever logic you'd like here. 
     locations.find(:all, :include => [:employees]).collect {|l| l.employees } 
    end 

    end 

end 

u = User.find 1 
u.locations.employees #=> calls our method defined above 

И увидеть это:

http://ryandaigle.com/articles/2006/12/3/extend-your-activerecord-association-methods

Вы также можете попробовать has_many :through:

class User 

    has_many :user_locations 
    has_many :locations, :through => :user_locations 


    # Not sure if you can nest this far, this guy has problems with it: 
    # http://tim.theenchanter.com/2008/10/how-to-hasmany-through-hasmany-through.html 
    # 
    # Maybe if locations was a habtm instead of :through? experiment with it! 
    # 
    has_many :employees, :through => :locations 

end 

u = User.find 1 
u.employees #=> Uses associations to figure out the SQL 

В общем, Ли, я Я заинтересован в вашей модели данных. В настоящее время отношения HABTM не рекомендуются. Использование has_many :through позволяет вам назвать таблицу соединений, а затем вы можете хранить атрибуты в отношениях с лучшим бизнес-значением. Я бы сказал, что «Railsy» заключается в том, чтобы добавить некоторые сквозные отношения, чтобы выявить больше моделирования домена.

Кроме того, некоторые примеры моделей были бы полезны, чтобы действительно понять ваш вопрос.

Удачи вам!

0

Я предполагаю, что следующее верно и что ваши ActiveRecords будут отражать это.

user belongs_to location 
location has_many users 
location has_many employees 
employee belongs_to location 

то в вашем пользователя ActiveRecord

has_many :employees :through => :locations 

можно сказать, что я думаю, что должно работать.

UPDATE:

Просто понял, что ваш пользователь имеет много места, а также. Не совсем уверен, что выше будет работать или нет. Однако стоит попробовать.

0

Вы можете определить метод в пользователе вроде следующего

def get_all_related_employees 
    employees = [] 
    self.locations.each do |location| 
     employees << location.employees 
    end 
    employees 
end 

или вы могли бы сделать это правильно инлайн

current_user.locations.map {|location| location.employees }.each do |employee| 
    puts employee.name 
end