代码之家  ›  专栏  ›  技术社区  ›  reto

情侣关系中的微笑

  •  1
  • reto  · 技术社区  · 17 年前

    这是获取给定就业对象的所有兄弟姐妹(属于同一用户)的有效和清晰的方法吗?

    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))
    

    雷托

    1 回复  |  直到 17 年前
        1
  •  3
  •   EmFi    17 年前

    看起来不错。除了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 。虽然这样做意味着你不能分配给兄弟姐妹。兄弟姐妹的叫声稍微干净一点。性能可能会有所改善,但可能不会有太大影响。