2017-10-18 39 views
0

我有一个用例,我需要根据它们的created_at或它们的start_on值查询Appointment记录。有两种类型的约会:“估计”“GLA(去看看)”,由type字段值在0和1MySQL/Rails - 基于每个记录的属性动态查询表字段

表示如果约会型估计,查询的需求要使用start_on字段 - 并且如果约会是GLA,则查询需要使用created_at字段,因为GLA的未调度并且没有start_on值。

现在,我使用查询Rails的范围下渗谁已经从与某个日期,像这样有他们的最后一次约会属性(“从”下面所示)中的数据:

scope :last_appointment_from, ->(date, type) { 
    query = joins(:appointments) 
    query = query.where('appointments.start_on = (
    SELECT MAX(appointments.start_on) 
    FROM appointments 
    WHERE appointments.property_id = properties.id)') 
    query = query.where('appointments.start_on >= ?', date) 
    query 
} 

但是,这只查询start_on值。

我试过寻找最伟大的(MAX(start_on),MAX(created_at)) - 但我不知道如何知道哪个字段知道在where('events.start_on >= ?', date)部分使用。

输入了这一点后,我想另一个可能的解决方法的 - 只是创建系统会根据什么类型的约会是的,称为query_field或某事(和运行上的活动记录的回调与相应的日期更新其他数据库字段一个为所有现有记录设置该值的脚本) - 那样我就可以在该字段上查询?

任何想法/帮助非常感谢!

+0

您是否会将该类型传递给作用域,因为您在问题中包含该类型,或者是否希望将这两种类型的连贯列表放在一起? –

+0

我想要一个包含较大者的列表。因此,如果其最大预约日期(不论哪种类型)的开始日期大于估算时选择的日期或创建日期大于GLA案例中选择的日期,那么它将返回属性。 – gregblass

回答

0

由于您已经有一个类型字段,因此它可能是STI的用例,即模型使用相同的SQL模式,但在ruby方面有不同的行为。

请注意,“类型”字段可能已经导致您可能没有考虑过的导轨问题,因为此字段通常专门用于导轨中的Single Table Inheritance STI

如果您使用STI,您可以编写一个访问器,从数据库中提取正确的字段并将其显示给每个模型。

+0

使用'self.inheritance_column =:_type_disabled' – gregblass

+0

这是一个坚实的途径。 – gregblass

+0

请谨慎行事,因为性病可能会变得棘手。 :P – engineerDave

0

我觉得这个方法应该工作假设没有任命之前应该有一个created_atstart_on除非是GLA

scope :last_appointment_from, ->(date, type) { 
    query = joins(:appointments) 
    query = query.where('GREATEST(appointments.start_on, appointments.created_at) = (
    SELECT GREATEST(MAX(start_on), MAX(created_at)) 
    FROM appointments 
    WHERE appointments.property_id = properties.id)') 
    query = query.where('GREATEST(appointments.start_on, appointments.created_at) >= ?', date) 
    query 
} 
0

我不是很好用Rails的,但对于纯粹的MySQL,你可以使用where像这样:

 
WHERE (
     (appointments.created_at > date 
      AND appointments.type = 1) 
     OR 
     (appointments.start_on > date 
      AND appointments.type = 0) 
    )