MySQL/Rails - 基于每个记录的属性动态查询表字段
我有一个用例,我需要根据它们的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
或某事(和运行上的活动记录的回调与相应的日期更新其他数据库字段一个为所有现有记录设置该值的脚本) - 那样我就可以在该字段上查询?
任何想法/帮助非常感谢!
由于您已经有一个类型字段,因此它可能是STI的用例,即模型使用相同的SQL模式,但在ruby方面有不同的行为。
请注意,“类型”字段可能已经导致您可能没有考虑过的导轨问题,因为此字段通常专门用于导轨中的Single Table Inheritance STI。
如果您使用STI,您可以编写一个访问器,从数据库中提取正确的字段并将其显示给每个模型。
使用'self.inheritance_column =:_type_disabled' – gregblass
这是一个坚实的途径。 – gregblass
请谨慎行事,因为性病可能会变得棘手。 :P – engineerDave
我觉得这个方法应该工作假设没有任命之前应该有一个created_at
其start_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
}
我不是很好用Rails的,但对于纯粹的MySQL,你可以使用where像这样:
WHERE ( (appointments.created_at > date AND appointments.type = 1) OR (appointments.start_on > date AND appointments.type = 0) )
您是否会将该类型传递给作用域,因为您在问题中包含该类型,或者是否希望将这两种类型的连贯列表放在一起? –
我想要一个包含较大者的列表。因此,如果其最大预约日期(不论哪种类型)的开始日期大于估算时选择的日期或创建日期大于GLA案例中选择的日期,那么它将返回属性。 – gregblass