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

轨道:有条件加载关联

  •  2
  • Jay  · 技术社区  · 16 年前

    我有模特 club 和 course 一个课程属于一个俱乐部,而一个俱乐部有许多课程。

    当我加载一个俱乐部时,我也想加载它的相关课程,但我只想加载那些符合条件测试的课程( approved? == true ).

    @courses = Course.find( :all, :conditions => {:approved => true } )
    

    @club = Club.find(params[:id])
    

    因为我的观点是这样形成的,我宁愿不必全部改变。

    谢谢!

    3 回复  |  直到 16 年前
        1
  •  2
  •   Chubas    16 年前

    如果你只考虑俱乐部的课程,如果它已被批准,你可以这样做

    class Club < ActiveRecord::Base
      has_many :courses, :conditions => {:approved => true}
    end
    

    @club = Club.find(params[:id], :include => :courses)
    

    现在,我不知道我是否误解了你,但你说“你的观点是这样建立的”。你是说你的管制员吗?因为如果你的观点有这样的逻辑。。。 DHH每次有人这么做都会杀一只小猫。

        2
  •  1
  •   Harish Shetty    16 年前

    你可以用 default_scope

    class Club < ActiveRecord::Base
      has_many :courses, conditions => {:approved => true}
      default_scope :include => :courses
    end
    
    class Course < ActiveRecord::Base
      default_scope :conditions => {:approved => true}
    end
    

    现在您可以这样做:

    @club = Club.find(1) # this will eager load approved courses.
    

    Article 默认\u范围 .

    附注1

    courses 联合 Club 选择批准的课程。从理论上讲,这并不是必要的 Course 类具有默认作用域。但是,默认范围似乎不适用于急于加载的查询。

    附注2

    课程 对象通过 . 通过一个默认的\u作用域进行操作,可以根据需要提供一个不引人注目的解决方案。

    include find 调用以加载 对象仅在需要时。

    附注3

    screen cast . 他给出了一个使用默认作用域排除已删除记录的示例,即。

    default_scope :conditions => "delete_at IS NULL"
    

    我认为这个用例是相似的。在我看来,课程模型的主要操作是在已批准的记录和 默认\u范围 与 conditions 选项确保了这一点。要覆盖默认的\u范围,用户可以使用 with_exclusive_scope

    Club.with_exclusive_scope{find(1)}
    
        3
  •  0
  •   Jay    16 年前

    最终的解决方案来自于一系列的答案,但两者都没有完全解决。

    当前解决方案: 我在 course 模型来实现我想要的功能,同时尽可能保持我的视图的通用性(能够干涸代码是必须的)。

    课程 模型看起来有点像这样:

    class Course < ActiveRecord::Base
      belongs_to :club
    
      named_scope :have_approval, :conditions => { :approved => true }
      named_scope :need_approval, :conditions => { :approved => false }
    end
    

    要收集所有批准的课程,只需:

    @approved_courses = Course.have_approval
    

    或者和一个 club ,在俱乐部获得认可的课程就像:

    @club = Club.find(:first)
    @approved_courses_in_club = @club.courses.have_approval
    

    推荐文章