我的客户端有一个图像/媒体数据库,它使用文件命名约定,其中包含文件名本身中每个图像的页码。
图像是书籍的扫描,第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方法来实现这一目标?
答案 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}