是否可以使用Ruby Sequel实现SUBSTRING_INDEX逻辑来创建列别名?

时间:2014-09-12 06:22:14

标签: mysql ruby substring sequel

我的客户端有一个图像/媒体数据库,它使用文件命名约定,其中包含文件名本身中每个图像的页码。

图像是书籍的扫描,第1页通常只是封面图像,书籍的实际“页面1”扫描在扫描编号3之类的东西上。考虑到这一点,文件名在数据库中看起来像这样字段filename

  • great_book_001.jpg
  • great_book_002.jpg
  • great_book_003_0001.jpg
  • great_book_004_0002.jpg
  • great_book_005_0003.jpg

考虑到这一点,我想使用MySQL的SUBSTRING_INDEX从文件名中提取该页码。使用纯MySQL,我花了大约5分钟来提出这个原始查询非常有效:

SELECT `id`, `filename`, SUBSTRING_INDEX(SUBSTRING_INDEX(`filename`, '.',  1), '_',  -1) as `page`
FROM  `media_files`
WHERE CHAR_LENGTH(SUBSTRING_INDEX(SUBSTRING_INDEX(`filename`, '.',  1), '_',  -1)) = 4
ORDER BY `page` ASC
;

问题是我试图了解在使用Sequel Gem for Ruby时是否可以使用SUBSTRING_INDEX实现列别名?

到目前为止,我似乎无法通过最初创建这样的数据集来实现这一目标:

# Fetch a dataset of media files.
one_to_many :media_files, :class => MediaFiles,
  :key => :id, :order => :rank

由于返回的数据集是一个数组,我正在使用Ruby map method滚动获取的数据集&然后在使用the Ruby merge

page插入数据集之前进行一些字符串处理
# Roll through the dataset & set a page value for files that match the page pattern.
def media_files_final
  media_files.map{ |m|
    split_value = m[:filename].split(/_/, -1).last.split(/ *\. */, 2).first
    if split_value != nil && split_value.length == 4
      m.values.merge({ :page => split_value })
    else
      m.values.merge({ :page => nil })
    end
  }
end

工作正常。但与一个简单的MySQL查询相比,这对我来说似乎很笨拙,它可以一举完成。所以问题是,有什么方法可以使用Sequel Gem for Ruby来获得相同的结果吗?

我认为在Sequel框架中可能不容易SUBSTRING_INDEX支持{{1}}。但如果没有,我是否有机会插入原始MySQL而不是使用Sequel方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

如果您希望关联使用​​该附加选定列和该过滤器,只需使用:select:conditions选项:

substring_index = Sequel.expr{SUBSTRING_INDEX(SUBSTRING_INDEX(:filename, '.',  1), '_',  -1)}
one_to_many :media_files, :class => MediaFiles,
  :key => :id, :order => :page,
  :select=>[:id, :filename, substring_index.as(:page)],
  :conditions => {Sequel.function(:CHAR_LENGTH, substring_index) => 4}