Silblings в отношениях has_many - PullRequest
       16

Silblings в отношениях has_many

1 голос
/ 26 октября 2009

У пользователя много занятий.

Что ты думаешь? Является ли это действительным и понятным способом получения всех братьев и сестер (принадлежащих одному пользователю) данного объекта занятости?

class Employment < ActiveRecord::Base
  belongs_to :user

  has_many :silblings,
    :primary_key => :user_id,
    :foreign_key => :user_id,
    :class_name => 'Employment'
end

Это может быть расширено следующей именованной областью действия:

  named_scope :except, lambda {|id| {:conditions => ["id != ?", id]} if id}

Теперь я могу делать такие вещи, как:

  self.silblings.except(self.id).each do |silbling|
    puts silbling
  end

Результирующий оператор SQL выглядит следующим образом:

  SELECT * FROM `employments` 
  WHERE (`employments`.user_id = 49) 
  AND ((id != 46) AND (`employments`.user_id = 49))

Приветствуются такие комментарии, как «нет, вы злоупотребляете XY, лучше используйте этот XZ»

Reto

1 Ответ

3 голосов
/ 26 октября 2009

выглядит хорошо. За исключением того, что SQL удваивается ('employments'.user_id = 49) в запросе. Что ничего особенного. Если это то, чего вы действительно не хотите, вы можете определить родных братьев так:

class Employment < ActiveRecord::Base
  belongs_to :user

  named_scope :for_user, lambda { |user|
    { :conditions => {:user_id => user} }
  }

  named_scope :except, lambda {|employment|
    {:conditions => ["id != ?", employment}
  }

  def siblings 
    Employment.for_user(user_id).except(id)
  end

end

Верьте или нет, вы все еще можете вызывать именованные области на @employment.siblings. Хотя, поступая таким образом, вы не можете назначать братьев и сестер. Призыв братьев и сестер выходит немного чище. Может быть улучшение производительности, но это, вероятно, не будет иметь большого значения.

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