Rails: Нахождение детей детей в отношениях habtm activerecord - PullRequest
0 голосов
/ 05 августа 2009

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

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

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

current_user.locations.employees

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

Ответы [ 3 ]

1 голос
/ 05 августа 2009

Вы можете расширять ассоциации в 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 голосов
/ 05 августа 2009

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

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
0 голосов
/ 05 августа 2009

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

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

тогда вы можете сказать в своем User ActiveRecord

has_many :employees :through => :locations

Я думаю, это должно сработать.

UPDATE:

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

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