質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

2760閲覧

DBへ保存する前のオブジェクトを削除したい

Kaz_M

総合スコア7

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2018/12/11 15:20

編集2018/12/11 16:28

DBへ保存する前のオブジェクトを削除し、DBに保存しないようにしたいです。

以下の例はUserが複数のTaskを持つという形で、taskにはdatetime型のdateカラムがあるとします。

ruby

1class User < ApplicationRecord 2 has_many :tasks 3end 4 5class Task < ApplicationRecord 6 belongs_to :user 7end

ユーザーの希望日(User.preferred_date)を渡してそれに基づいてTaskを自動で複数生成し、ある条件下では特定のTaskを保存しないという処理にしたいのですが、まだDBに保存する前ですのでdestroyやdeleteではない適切な方法がわからず悩んでいます

ruby

1class TasksController < ApplicationController 2 def new_tasks_automativcally 3 @user = User.find(params[:id]) 4 end 5 6 def create_tasks_automatically 7 @user = User.find(params[:id]) 8 9   if @user.update(user_params) #user_paramsにはpreferred_dateが入る 10 11     @task1 = @user.tasks.build(task_name: "Task1") 12 @task1.date = @user.preferred_date 13 14 @task2 = @user.tasks.build(task_name: "Task2") 15 @task2.date = @task1.date + 5.years 16 if @task2.date > @user.birthday + 10.years 17 #ここで@task2を削除し、DBに保存しないようにしたい 18     #@task2.destroyで期待する動きはするが、データベースのモデルオブジェクトではないため適当ではない? 19 else 20 else 21 render :new_task_automatically 22 return 23 end 24 25 if @user.save 26 redirect_to user_path(@user) 27 else 28 render :new_task_automatically 29 end 30 end 31#中略 32end 33

コメントに記載してあるとおりdestroyで期待した動きはするのですが、DBに保存してあるモデルオブジェクトに対してdestroyメソッドを呼び出しているわけではないため、不適切である気がします。

上のような例はオブジェクトを削除する条件が複雑ではないので、条件判別の後にオブジェクトを生成するかどうか判断すれば良いのですが、実際はtaskのdateをかなり加工するため、加工後のdateの値を判断して、その上で削除したいです

Railsの知識がまだ浅いため、[オブジェクトを作成後に削除]という動きにしたいのですが、
やはりどれだけ複雑な条件であっても、条件式で判別した後に、オブジェクトを生成しないという処理にすべきなのでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

オブジェクトを「保存対象から」削除すればOKですよね
@user.save 時に一緒に保存される @user.tasks から目的のものを除外すれば良さそうです

ruby

1@user.tasks.delete(@task2)

投稿2018/12/12 00:33

Ighrs

総合スコア656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問