用常规查询替换find_by_sql

时间:2013-11-04 12:39:24

标签: ruby-on-rails

我有这个问题:

tag_names = Tag.find_by_sql "SELECT GROUP_CONCAT(' ', name) FROM tags WHERE id IN (#{tag_ids.join(',')}) AND tag_type = 'Communication_Ways'"

有没有办法在rails中使用:Tag.find(:all,???)

问题是此查询不返回任何内容,因为GROUP_CONCAT返回字符串而不是Tag模型。

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

您可以使用calculate方法执行GROUP_CONCAThttp://api.rubyonrails.org/v3.2.13/classes/ActiveRecord/Calculations.html#method-i-calculate

Tag.select(:name).where(:id => tag_ids, :tag_type => 'Communication_Ways').calculate(:group_concat, "name separator ' '")

更新Rails 2.3.8

计算Rails 2.3.8中的方法:http://api.rubyonrails.org/v2.3.8/classes/ActiveRecord/Calculations/ClassMethods.html#M001705

Tag.find(:all, :select => 'name', :conditions => ["id IN (?) AND tag_type = (?)", tag_ids.join(', '), 'Communication_Ways']).calculate(:group_concat, "name separator ' '")

答案 1 :(得分:0)

如果tag_ids是一个数组,我会尝试:

tag_names = Tag.find(:tag_id = tags_ids).map(&:name).uniq.join(',')

Rails会将[tag_ids]数组转换为IN语句。

您可能需要为2.3.8稍微改变语法,我使用rails 3和4。