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

有很多关系

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

    一个用户有很多工作。

    你怎么认为? 这是获取给定就业对象的所有同级(属于同一用户)的有效且清晰的方法吗?

    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”这样的评论是非常受欢迎的!

    雷托

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

    看起来很好。除了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 . 虽然这样做意味着你不能分配给兄弟姐妹。兄弟姐妹的叫喊声变得更清晰了。可能会有一个性能改进,但可能不会有显著的区别。