切换到新的分支进行开发
git checkout -b fourth/barcode
构造数据
rails g migration CreateProductBrands
rails g migration CreateProductHistories
rails g migration CreateTags
执行迁移
rake db:migrate
填充数据
products添加p8记录和填充SecondTagID
product_infoes添加info8记录和填充ProductBrandID字段
product_second_tags填充TagID字段
添加模型文件,因为创建的表名符合默认约定,不写self.table_name也行
添加路由
添加动作
无论是在控制器还是视图中,查询语句里面含有#{}的解析符就可能导致sql注入
#barcode_scanner_one是错误示例,会导致sql注入
def barcode_scanner_one
end
这个示例虽然显示没有问题,但是存在漏洞,#{}的解析符出现在查询条件里面会导致sql注入。
我们应该用占位符?代替#{}的解析符,如下是正确案例
def barcode_scanner_two
end
因为我们需要通过{:product_second_tag=>[:tag]}访问到关联的数据,于是我们添加如下模型关联
同理我们还要添加一个模型关联
不过上面那样添加关联后面会导致如下的错误,这个是for nil class的另外一种情况。前面出现for nil class是因为没有关联的记录,而下面这种则是有关联的记录但是模型关联里面没有写关联或者写了关联关系但是没有写出foreign_key所以无法找到关联的数据
修改模型关联为如下:
场景实现
根据params传入商品编码(也可以是原生app二维码扫码,这里我们使用url携带参数模拟),一个编码对应一个商品就直接显示详细信息;一个编码对应多个商品就显示列表页,点击列表项来到该列表项对应的详细信息。
一个编码对应多个商品,结果是列表页,点击列表项来到详细信息页面
一个编码对应一个商品则直接显示详细信息页,可以看到路由url与点击列表项来到的详细信息页的url中携带ProductID不同
如下品牌和预售数量为空是因为info22关联的product_info记录不存在,而其他关联数据存在
查看控制台信息,可以看到sql语句没有出现n+1问题,说明完成任务合格
排序生效,如下我们反过来排序结果也反过来了
排序的写法还可以这么写,结果是一样生效的
然后提交修改:
git add .
git commit -m "商品编码查询"
git push -u https://github.com/xiaohuacc/active_record.git fourth/barcode
Counting objects: 26, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (23/23), done.
Writing objects: 100% (26/26), 5.67 KiB | 0 bytes/s, done.
Total 26 (delta 9), reused 0 (delta 0)
remote: Resolving deltas: 100% (9/9), completed with 8 local objects.
To https://github.com/xiaohuacc/active_record.git
* [new branch] fourth/barcode -> fourth/barcode
Branch fourth/barcode set up to track remote branch fourth/barcode from https://github.com/xiaohuacc/active_record.git.
合并到主分支
git checkout master
git merge fourth/barcode