0

以下查询在某些情况下返回 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 语法

谢谢

4

2 回答 2

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

这回答了你的问题吗?

于 2013-04-05T16:35:42.713 回答
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 :claim 能力 为此,我需要一个能够使用该查询的范围,如上面的链接中所述。但有时查询不返回任何结果——或 nil——。

在我的能力.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

在 User 类中,我定义了需要它来获得我的结果的范围

 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') 
于 2013-04-05T18:57:03.997 回答