基于字段的嵌套模型的条件顺序

基于字段的嵌套模型的条件顺序

问题描述:

我有一个has_many结果的事件模型。我想根据事件中的字段排序结果。基于字段的嵌套模型的条件顺序

我目前在事件:

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => "IF(self.etype = 'Stroke', 'results.score ASC', 'results.score DESC')" 

...但是这deosn't工作。例如,有没有更好的方式来与named_scope做到这一点? 对不起,我是新来的Rails。

+0

你为什么在你的查询中做self.etype? – 2011-03-15 03:28:50

+0

根据'Event'中的'etype',我想要所有结果的不同顺序。 – ubangy 2011-03-15 11:07:15

尝试这种情况:

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => '#{(self.etype == "Stroke") ? 
        "results.score ASC" : "results.score DESC"}' 

当引用字符串或纯红宝石码被用作一个属性值,其在类装载时间被评估。在这种情况下,selfclass而不是class的实例。由于用户想要根据对象在手的属性值改变ORDER BY的方向,所以应该将其包含在侧单引号中。在这种情况下,selfclass的一个实例。

+0

为什么连字符串都打扰? '(self.etype ==“笔画”)? “results.score ASC”:“results.score DESC”' – 2011-03-15 03:32:36

+0

当您使用带引号的字符串或普通的ruby代码时,该值将在类加载时进行评估。在这种情况下,'self'是'Class'而不是'Class'的实例。由于用户想要根据实例的属性值更改“ORDER BY”方向,因此条件应该放在侧单引号中。 – 2011-03-15 04:22:33

+0

现在我得到:“SQLite3 :: SQLException:无法识别的令牌:”#“:...”。有任何想法吗? – ubangy 2011-03-15 10:32:07

这是否解决了它?

has_many :results, :dependent => :destroy, :include => [:event], :order => "IF(results.etype = 'Stroke', 'event.score ASC', 'event.score DESC')" 

如果不是这样,当您尝试这样做在控制台什么错误返回:

Event.first.results 
+0

我现在甚至没有尝试过,因为它没有任何意义。 'score'在'Result'中,'etype'在'Event'中。 – ubangy 2011-03-15 11:48:01

+0

因此,您想要根据结果中的字段排序结果,而不是事件吗?你的问题恰恰相反。 – ctide 2011-03-15 17:09:05

试试这个:

在轨3.0.x的

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => "#{(proxy_owner.etype == 'Stroke') ? 
        'results.score ASC' : 'results.score DESC'}" 

In rails 3.xx:

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => "#{(proxy_association.owner.etype == 'Stroke') ? 
        'results.score ASC' : 'results.score DESC'}" 

希望这会有所帮助。