使用ActiveRecord帮助程序执行OR和AND条件

时间:2014-02-17 13:55:41

标签: sql ruby-on-rails

我正在RoR中创建一个数据库支持的日历,第一步是返回给定年份内的所有事件。我的事件表模式如下:

id:integer description:string startdate:datetime enddate:datetime

在英语中,我认为这是我需要执行的逻辑,以返回给定年份内的所有事件:

  

(当事件开始小于年度开始事件结束大于年度开始)或

     

(当活动开始大于年度开始活动结束小于年终)或

     

(当活动开始小于年末活动结束大于年开始)< / p>

第一行获取在给定年份结束的所有事件,第二行获取一年内的所有事件,最后一行获取在一年内开始的所有事件。

这种逻辑可以提高效率吗?

我已经阅读了ActiveRecord手册并创建了一些公平的动态网站,但我只需要Person.find(34)Person.where(name: 'Jimmy')并且真的不知道如何执行上述逻辑ActiveRecord的辅助方法!

3 个答案:

答案 0 :(得分:1)

使用ActiveRecord where方法,您可以传递string查询以满足您的需求。如下所示:

your_string = "events.start_date > ...."
Model.where(your_string)

答案 1 :(得分:1)

在模型中写一个范围

class Event < ActiveRecord::Base

    scope :event_in_year, lambda { |year|  where('(events.startdate < ? AND events.enddate > ? ) OR (events.startdate > ? AND events.enddate < ? ) OR (events.startdate < ? AND events.enddate > ? )', year.beginning_of_year, year.beginning_of_year, year.beginning_of_year, year.end_of_year, year.end_of_year, year.beginning_of_year )}
    end

然后使用此范围通过将该年份传递到此范围来查找任何年份之间的事件

答案 2 :(得分:0)

我认为你可以简化为

SELECT DISTINCT  id, description FROM calendar
WHERE enddate >= myyear AND endate <= myyear + 1
  OR (startdate >= myyear AND startdate <= myyear + 1)

第一个WHERE子句行给出了那一年的所有结尾,包括那一年的开始和结束,第二个给出了那一年的所有开始。使用DISTINCT,您只能获得结束并在同一年开始

有关数据库的确切语法