2017-02-06 48 views
1

rails console里面我能够很容易地和理智得到使用ActiveRecordORM:第一项的风格的零售价格:使用导轨控制台SQL查询字符串学习SQL

[25] pry(main)> Item.first.style.retail_price 
    Item Load (0.2ms) SELECT "items".* FROM "items" ORDER BY "items"."id" ASC LIMIT 1 
    Style Load (0.1ms) SELECT "styles".* FROM "styles" WHERE "styles"."id" = ? LIMIT 1 [["id", 1]] 
=> #<BigDecimal:7fe7a6bc7678,'0.6E2',9(27)> 

another post读了我可以使用ActiveRecord::Base.connection.execute来运行原始的sql命令。我预料之中,因为Item.first.style.retail_price.to_s #=> "60.0"取而代之的是我得到某种阵列的内部具有散列得到的东西看起来有点像'60 0.0' 背:

[26] pry(main)> ActiveRecord::Base.connection.execute('SELECT "items".* FROM "items" ORDER BY "items"."id" ASC LIMIT 1; SELECT "styles".* FROM "styles" WHERE "styles"."id" = ? LIMIT 1 [["id", 1]]') 

    (0.2ms) SELECT "items".* FROM "items" ORDER BY "items"."id" ASC LIMIT 1; SELECT "styles".* FROM "styles" WHERE "styles"."id" = ? LIMIT 1 [["id", 1]] 
=> [{"id"=>1, "size"=>"M", "color"=>"Purple", "status"=>"sellable", "price_sold"=>nil, "sold_at"=>nil, "style_id"=>1, "created_at"=>"2017-02-04 04:47:09.415828", "updated_at"=>"2017-02-04 04:47:09.415828", "clearance_batch_id"=>nil, 0=>1, 1=>"M", 2=>"Purple", 3=>"sellable", 4=>nil, 5=>nil, 6=>1, 7=>"2017-02-04 04:47:09.415828", 8=>"2017-02-04 04:47:09.415828", 9=>nil}] 

而且当我尝试相同的查询字符串rails db我出现语法错误:

rails db 
SQLite version 3.14.0 2016-07-26 15:17:14 
Enter ".help" for usage hints. 
sqlite> SELECT "items".* FROM "items" ORDER BY "items"."id" ASC LIMIT 1; SELECT "styles".* FROM "styles" WHERE "styles"."id" = ? LIMIT 1 [["id", 1]]; 
1|M|Purple|sellable|||1|2017-02-04 04:47:09.415828|2017-02-04 04:47:09.415828| 
Error: near "[["id", 1]": syntax error 
sqlite> 

3个问题:

  1. 什么串并ActiveRecord::Base.connection.execute需要返回期望的结果,看起来像60.0?
  2. rails db需要什么字符串?
  3. 如何将rails console给我的sql字符串转换为可与ActiveRecord::Base.connection.executerails db一起使用的原始sql查询字符串的一般模式是什么?

回答

1

如果您只需要一个实数的一个字段,则必须在SQL中的select子句中指定它。这样

SELECT styles.retail_price FROM styles WHERE styles.id = 1 

在这种情况下的东西,你得到只是retail_price但在一个数组,如果你使用的轨道的execute方法。如果您只想使用select_value方法的单个值,而不是execute。像

ActiveRecord::Base.connection.select_value("SELECT styles.retail_price FROM styles WHERE styles.id = 1") 

在sqlite3的终端,你获得,因为这[["id", 1]]的语法错误。这是用于准备语句的rails/applicative-level的东西,但不是有效的SQL。你应该像我一样替换id。