2020年8月28日金曜日

ActiveRecordでjoinして同じカラム名の値があると後勝ちになる。

やっちゃいがちなはまりポイント。
irb(main):033:0> Visit.all.joins(:items).select('visits.id, items.id').first.attributes
  Visit Load (2.0ms)  SELECT  visits.id, items.id FROM `visits` INNER JOIN `items` ON `items`.`visit_id` = `visits`.`id` ORDER BY `visits`.`id` ASC LIMIT 1
=> {"id"=>2}
irb(main):032:0> Visit.all.joins(:items).select('visits.id as visit_id, items.id as item_id').first.attributes
  Visit Load (2.6ms)  SELECT  visits.id as visit_id, items.id as item_id FROM `visits` INNER JOIN `items` ON `items`.`visit_id` = `visits`.`id` ORDER BY `visits`.`id` ASC LIMIT 1
=> {"id"=>nil, "visit_id"=>101, "item_id"=>2}
visits, itemsともにid があるが、 結果から .id として取得するとitemsのidになる。 SQLだと
  > select id from visits join items on visits.id = items.visit_id where visits.id = 101 \G;
ERROR 1052 (23000): Column 'id' in field list is ambiguous
となってそもそも実行できないがActiveRecordだとエラーにはならない。 ActiveRecordでselect句を使うのは結構注意。.* で指定するのやめた方がよさそう。

2020年8月16日日曜日

Vue: createdで実行したメソッドでdata要素に代入するには。

createdで実行してdataの要素に値を代入するには同期処理にしないとうまくいかなかった。
  export default {
    props: {
      prospectId: Number
    },
    data: function(){
      return {
        targetDate: null,
        categoryOptions: [],
        visitCategoryId: null
      }
    },
    created: function(){
      this.set_category_options();
    },
    methods : {
      set_category_options: async function() {
        const res = await axios.get('/visit_categories.json');
        this.categoryOptions = res.data;
      }
    }