rails将包含返回nil的include查询转换为范围lambda

时间:2013-04-05 13:39:10

标签: ruby-on-rails-3

以下查询在某些情况下返回nil

 scope :claim_one, where(" location_id IS NULL OR start_time IS NULL OR archived IS NULL " ).includes(:instructor_assignments).where('instructor_assignments.user_id IS NULL') 

我想将查询转换为lambda函数,该函数负责查询返回的nil,如下所示;

scope :claim, (lambda  do  |claim| where(" location_id IS NULL OR start_time IS NULL OR archived IS NULL ").includes(:instructor_assignments).where('instructor_assignments.user_id IS NULL', claim ) unless claim.nil? end )

后者不起作用,因为我认为它没有正确的rails语法

谢谢

2 个答案:

答案 0 :(得分:0)

不确定我是否完全理解(见上面的评论),但我希望这会有所帮助。我认为你的代码的结果将是一个ActiveRecord :: Relation,其中没有记录而不是nil。我假设“声明”是您要传入的参数。如果是这种情况,您可以按如下方式添加它。

处理lambda范围的首选方法现在要好得多;只需使用类方法:

def self.claim_one(claim)
  return [whatever you want] unless claim
  where(" location_id IS NULL OR start_time IS NULL OR archived IS NULL " ).
    includes(:instructor_assignments).
    where('instructor_assignments.user_id IS NULL')
end

我会建议以下内容,以使您的示波器更易于单独使用,更易于理解和测试,并且只是愚蠢:

def self.incomlete()
  where(" location_id IS NULL OR start_time IS NULL OR archived IS NULL " )
end

def self.without_instructor()
  includes(:instructor_assignments).where('instructor_assignments.user_id IS NULL')
end

要打电话给我,我会使用类似的东西:

result = YourModel.incomplete.without_instructor
if result.empty?
  # do yo funky "ain't got no records dance"
else
  # record jackpot!  
end

这回答了你的问题吗?

答案 1 :(得分:0)

很好,我应该以更好的方式陈述事情

我正在使用Ryan Bates CanCan gem

中的CanCan gem

在我看来,我有以下代码:

  <% if can? :claim, @workshop %>
  <%= link_to claim_workshop_path(@workshop), :method =>  :post , :class => "mybtn btn-mini claim-workshop-button"  do %>
    <%= t(:Claim) %>
    <%= content_tag(:i, "", :class => "icon-thumbs-up").html_safe %>
 <% end %>
<% end %>

我希望能够使用来自Ryan Bates CanCan的te:声明能力 为此,我需要一个范围才能使用该查询,如上面的链接所述。但有时查询不返回结果 - 或者返回nil - 。

在我的ability.rb文件中,我有以下使用范围的代码

f user.role == "admin" || user.role  = "scheduler"
     can :manage, :all
     can :claim , Workshop.claim do |workshop_instance|
       # workshop_instance.can_claim?
        workshop_instance.instructor_assignments.nil?
     end
   else
     can :read, :all
   end

在我定义的用户类中,范围需要它来获取我的结果

 scope :claim, where(" location_id IS NOT NULL OR start_time IS NOT NULL  " ).includes(:instructor_assignments).where('instructor_assignments.user_id IS NOT NULL')