teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

情報を追記いたしました

2020/04/23 00:41

投稿

usa_mal
usa_mal

スコア16

title CHANGED
@@ -1,1 +1,1 @@
1
- Rails, 取得したデータの整形
1
+ Rails 取得したデータの整形
body CHANGED
@@ -1,5 +1,5 @@
1
1
  Rails で質問させてください。
2
- 異なる2つのテーブル(モデル)を union で結合して取得した下記の before のようなデータを下記のafterような形に整形して取得することは可能でしょうか?
2
+ 異なる2つのテーブル(モデル)を union で結合して取得した下記取得データの before のようなデータを下記取得データのafterような形に整形して取得することは可能でしょうか?
3
3
 
4
4
  やりたいこととしては、
5
5
  ・"type" が "1" のデータは、"child_id", "child_name", "child_period", "child_note", "child_done", "child_order_number" を削除してしまう。
@@ -9,7 +9,48 @@
9
9
  やり方をご教授いただけますと幸いです。
10
10
 
11
11
 
12
+ ##model
13
+ ```rb
14
+ class Project < ApplicationRecord
12
15
 
16
+
17
+ has_many :todos, dependent: :destroy
18
+ accepts_nested_attributes_for :todos, allow_destroy: true
19
+
20
+ has_many :tasks, dependent: :destroy
21
+ accepts_nested_attributes_for :tasks
22
+
23
+ def self.getCombineTodos(project_id)
24
+ sql = <<-EOS
25
+ (select '1' as type_flg, pt.pt_id as id, pt.name as name, pt.period, pt.note, pt.done, pt.order_number, 0 as child_id, 0 as child_name, 0 as child_period, 0 as child_note, 0 as child_done, 0 as child_order_number from (select project_todos.id + 100000000 as pt_id, project_id, period, project_todos.note, done, project_todos.name as name, order_number from project_todos where project_todos.project_id = :project_id) as pt)
26
+ union
27
+ (select '2' as type_flg, pt.id + 200000000, pt.name, pt.period, pt.note, pt.done, pt.order_number, ptt.id as child_id, ptt.name as child_name, ptt.period, ptt.note as chile_note, ptt.done as child_done, ptt.order_number as child_order_number from project_tasks as pt
28
+ left outer join project_task_todos as ptt on pt.id = ptt.project_task_id where pt.project_id = :project_id) ORDER BY order_number ASC
29
+ EOS
30
+ find_by_sql([sql, { project_id: project_id }])
31
+ end
32
+
33
+ end
34
+ ```
35
+
36
+ ##controller
37
+ 上記のmodel内のsqlで取得できるデータを、下記のメソッドで、フロント(Vue)側に渡します。
38
+ ```
39
+ # todoとtaskをまとめて同列にして取得
40
+ def combine_todos
41
+ project = Project.getCombineTodos(params[:id])
42
+
43
+ render json: {
44
+ status: 'SUCCESS',
45
+ message: '',
46
+ data: project
47
+ }
48
+ end
49
+ ```
50
+
51
+ ##取得データ
52
+
53
+
13
54
  ```before
14
55
  "data":[
15
56
  {
@@ -183,6 +224,9 @@
183
224
  ]
184
225
  ```
185
226
 
227
+
228
+
229
+
186
230
  ####捕捉
187
231
  ruby-2.6.2
188
232
  Ruby on Rails 5.2.3