以下查询在某些情况下返回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语法
谢谢
答案 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)
很好,我应该以更好的方式陈述事情
中的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')