在ActiveRecord关联中使用FIELD

时间:2015-12-14 14:09:11

标签: mysql ruby-on-rails activerecord

我想首先显示使用当前区域设置标记的帖子。我认为MySQL FIELD函数是解决这个问题的好方法。

然而,

Post.includes(:tags).order("FIELD(tags.name, '#{I18n.locale}') DESC").first

结果

Mysql2::Error: Unknown column 'tags.name' in 'order clause': SELECT  spree_posts`.* FROM 'spree_posts' ORDER BY FIELD(tags.name, 'en') DESC LIMIT 1

如果我尝试

Post.includes(:tags).order("FIELD(tags.name, '#{I18n.locale}') DESC").where.not(tags: { name: 'WTF?' } )

它正确地根据FIELD方法返回帖子,但是使用标签进行连接,因此不返回没有标签的所有帖子:(

我认为这可能是ActiveRecord中的错误?这绝对不是我期望的行为。

1 个答案:

答案 0 :(得分:1)

  

SELECT spree_posts`。* FROM'spree_posts'ORDER BY FIELD(tags.name,   'en')DESC LIMIT 1

此查询中没有tags表,因为includes是一种智能方法,只有在{{1 }。clause。

您需要明确定义JOIN

WHERE

(默认情况下LEFT JOIN生成Post.joins('LEFT JOIN tags ON tags.post_id = post.id').order("FIELD(tags.name, '#{I18n.locale}') DESC").first