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

質問編集履歴

1

入力終了前に送信してしまったため全面的に再入力

2018/12/11 16:28

投稿

Kaz_M
Kaz_M

スコア7

title CHANGED
@@ -1,1 +1,1 @@
1
- DBへ保存する前のオブジェクト削除につ
1
+ DBへ保存する前のオブジェクト削除した
body CHANGED
@@ -1,6 +1,7 @@
1
- DBへ保存する前のオブジェクトを削除する方法がわからず困って
1
+ DBへ保存する前のオブジェクトを削除し、DBに保存しなようにしたいで
2
- Userが複数のTaskを持つ、という形です
3
2
 
3
+ 以下の例はUserが複数のTaskを持つという形で、taskにはdatetime型のdateカラムがあるとします。
4
+
4
5
  ```ruby
5
6
  class User < ApplicationRecord
6
7
  has_many :tasks
@@ -9,28 +10,54 @@
9
10
  class Task < ApplicationRecord
10
11
  belongs_to :user
11
12
  end
12
-
13
13
  ```
14
14
 
15
- Taskを自動で複数生成した後に、ある条件下では特定のTaskを保存しないという処理にしたいのですが、まだDBに保存する前ですのでdestroyやdeleteを使用できないと思い困っています
16
15
 
16
+
17
+ ユーザーの希望日(User.preferred_date)を渡してそれに基づいてTaskを自動で複数生成し、ある条件下では特定のTaskを保存しないという処理にしたいのですが、まだDBに保存する前ですのでdestroyやdeleteではない適切な方法がわからず悩んでいます
18
+
19
+
17
20
  ```ruby
18
21
  class TasksController < ApplicationController
19
- def new
22
+ def new_tasks_automativcally
20
23
  @user = User.find(params[:id])
21
24
  end
22
25
 
23
- def create
26
+ def create_tasks_automatically
27
+ @user = User.find(params[:id])
28
+
29
+    if @user.update(user_params) #user_paramsにはpreferred_dateが入る
30
+
24
- @task1 = @user.tasks.build(task_name: "Task1")
31
+      @task1 = @user.tasks.build(task_name: "Task1")
25
-
32
+ @task1.date = @user.preferred_date
33
+
26
- @task2 = @user.tasks.build(task_name: "Task2")
34
+ @task2 = @user.tasks.build(task_name: "Task2")
27
- @task2 = @user.tasks.build(task_name: "Task2")
35
+ @task2.date = @task1.date + 5.years
36
+ if @task2.date > @user.birthday + 10.years
37
+ #ここで@task2を削除し、DBに保存しないようにしたい
38
+      #@task2.destroyで期待する動きはするが、データベースのモデルオブジェクトではないため適当ではない?
39
+ else
40
+ else
41
+ render :new_task_automatically
42
+ return
28
- end
43
+ end
44
+
45
+ if @user.save
46
+ redirect_to user_path(@user)
47
+ else
48
+ render :new_task_automatically
49
+ end
50
+ end
51
+ #中略
29
52
  end
30
53
 
31
54
  ```
55
+ コメントに記載してあるとおりdestroyで期待した動きはするのですが、DBに保存してあるモデルオブジェクトに対してdestroyメソッドを呼び出しているわけではないため、不適切である気がします。
32
56
 
33
57
 
34
58
 
59
+ 上のような例はオブジェクトを削除する条件が複雑ではないので、条件判別の後にオブジェクトを生成するかどうか判断すれば良いのですが、実際はtaskのdateをかなり加工するため、加工後のdateの値を判断して、その上で削除したいです
35
60
 
61
+
62
+ Railsの知識がまだ浅いため、[オブジェクトを作成後に削除]という動きにしたいのですが、
36
- どれだけ複雑な条件であっても、条件式で判別した後に、オブジェクトを生成しないという処理にすべきなのでしょうか
63
+ やはりどれだけ複雑な条件であっても、条件式で判別した後に、オブジェクトを生成しないという処理にすべきなのでしょうか