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

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

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

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

3回答

1754閲覧

Ruby On Rails 論理的削除 deleted_flg

fkryu

総合スコア31

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/01/18 03:47

編集2017/01/23 11:55

###前提・実現したいこと
こんにちは。
Ruby On Rails で物理的削除から論理的削除に変えたいと思っています。

色々なサイトを見たりしながらやっているんですがなかなかうまくいかず...
初心者ですが何卒よろしくお願い申し上げます。

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

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

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

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

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

IPU

2017/01/18 05:20

失敗している箇所のエラーログを貼ってください。多分、もっと手前の部分で失敗しているはずです。
fkryu

2017/01/18 08:50

エラーは出ていない状態でいます( ; ; )showページで投稿の削除ボタンを押したらエラー等は出ず、削除もされないといった状態になっています。どこか間違っているのでしょうか。。
guest

回答3

0

ベストアンサー

modelに delete_flag == false のrecordのみを取得する scope を追加し
controller(#index, #showなど)で利用するのはいかがでしょう?

例)
model

class Hoge < ActiveRecord::Base scope :availables, -> { Hoge.where(deleted_flg: false)} end

controller

class HogeController def index @hoges = Hoge.availables respond_to do |format| .............. end end def show @hoge = Hoge.availables.find(params[:id]) respond_to do |format| .............. end end end

投稿2017/01/18 06:19

編集2017/01/19 03:20
satoshih

総合スコア797

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

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

fkryu

2017/01/18 09:00

ご返事ありがとうございます。 showページで削除をして見たら ActiveRecord::StatementInvalid in BuildingsController#show Mysql2::Error: Unknown column 'buildings.delete_flg' in 'where clause': SELECT `buildings`.* FROM `books` WHERE `buildings`.`delete_flg` = 0 AND `buildings`.`id` = 8 LIMIT 1 と出てしまいました。。
satoshih

2017/01/18 10:38

buildings テーブルに delete_flg というカラムが無いというエラーだと思いますが、 migrationは正しく行えてますか?
fkryu

2017/01/19 00:32

はい。 現段階delete_flgのカラムが増え、editで削除したらdelete_flgが1になりindexでは無事表示できているのですが、showアクションで表示ができずにいます。。
fkryu

2017/01/19 00:35

Couldn't find Building without an ID と出てしまいます。 buildingのidではなくuser_idをfindできていないからだと思うのですが...
satoshih

2017/01/19 01:33

Couldn't find Building without an ID は find(id) のidに integer以外が渡された時に起きると思うのですが、findに何を渡してますか?
fkryu

2017/01/19 01:54

@buildings = Building.availables.find(params[:user_id]) と記述しています。。
satoshih

2017/01/19 01:57

params[:user_id]には何が入ってますか? また、Buildingのidで検索しないのであれば、 Building.availables.find_by(user_id: params[:user_id]) のようにしてみてください。
fkryu

2017/01/19 02:01

user_idカラムの数字(8)が入っています。 上記のコードを記述すると情報は表示されるのですが、deleted_flgが1のレコードも表示されてしまいます。。
satoshih

2017/01/19 02:10

deleted_flg は booleanじゃないんですね。。。。 回答に記載したソースはbooleanのつもりで書いてますので、 scopeで定義している where(条件) の条件で正しい値が取れるかどうか、 rails consoleなどで確認してみてください。
fkryu

2017/01/19 02:15

class AddDeleteFlgToBuildings < ActiveRecord::Migration def change add_column :buildings, :delete_flg, :boolean, null: false, default: false end end でmigrateしているのでbooleanになっていると思っていたのですが。。
satoshih

2017/01/19 02:27

すいません。MySQLの仕様のようですね。boolean == tinyint(1) のようです。 deleted_flg: false rails consoleで実行して正しい結果は返ってきませんか? もし返ってこないようでしたら、 where(deleted_flg: false) をwhere(deleted_flg: 0) にするなど 試してみてください
fkryu

2017/01/19 02:55

すみません。MySQLです。 irb(main):001:0> deleted_flg: false SyntaxError: (irb):1: syntax error, unexpected ':', expecting end-of-input deleted_flg: false ...................................... となります。
satoshih

2017/01/19 02:59

rails console で実行する場合は Building.where(deleted_flg: false) で試してみてください
fkryu

2017/01/19 03:06

ありがとうございます! Building.where(deleted_flg: false)の時もBuilding.where(deleted_flg: 0)の時も、削除していないレコード(deleted_flgが0)が表示されています。
satoshih

2017/01/19 03:21

すいません。回答のソースがtypoしてました scope :availables, -> { Hoge.where(delete_flg: false)} ではなく scope :availables, -> { Hoge.where(deleted_flg: false)} でした (回答は修正済みです)
fkryu

2017/01/19 03:27

わざわざありがとうございます。 はい。そちらで記述しています! consoleは問題ないのでしょうか??
satoshih

2017/01/19 04:05

consoleの結果がdeleted_flgがfalseのものだけが出力されているのでしたら、条件は問題無いです あとはモデルのscopeが scope :availables, -> { Building.where(deleted_flg: false) } になっていれば動くはずです。試してみてください (最初に書いたscopeは間違っていましたので修正してます)
fkryu

2017/01/19 04:22

ありがとうございます。 エラーはなく表示されるのですが、deleted_flgが0のレコードも1のレコードも全て表示されてしまいます。。 0のレコードだけを表示させるようにはできないでしょうか。。
satoshih

2017/01/19 04:56

状況を整理したいのですが、 rails consoleで Building.where(deleted_flg: false) とした場合の戻り値は期待する値が返ってきていますか?(y/n) rails console で返ってきた値とcontrollerで検索した値が一致しないですか?(y/n) BuildingsControllerでBuildingのdeleted_flgがfalseかつ、 paramsのuser_idが設定されているのレコードを検索したい?(y/n)
fkryu

2017/01/19 06:48

はい。 戻り値は理想通りに返ってきています。Y consoleではdeleted_flgが0のレコードだけなのですが、localhost:3000ではdeleted_flgが1のレコードも表示されてしまいます。Y はい。deleted_flgが0のレコードでidが設定されているレコードを検索できればとおもいます。Y
satoshih

2017/01/19 06:54

controller経由で取得した際に debug logにSQLコマンドが出るかと思うのですが、 そのSQLコマンドを貼っていただくことは可能ですか?
fkryu

2017/01/19 07:05

すみません。初心者であまりよくわからないのですがどう操作すれば良いのですか?
fkryu

2017/01/19 07:18

controllerで使用するavailablesはメソッドの前につけるイメージでindexアクションはできるようになったのですが、showアクションは最初は def show end だけで何も記述していなかったんです。
satoshih

2017/01/19 08:22

Controllerに before_filter などで 指定されているメソッドがあると思います。 そのメソッドで Buildingを検索するようになっていませんか?
fkryu

2017/01/19 08:39

おそらくshowアクションには何も書けてないと思います。。 初めの質問の最後に画像を添付しましたので確認していただけるとありがたく思います。。
satoshih

2017/01/19 08:45

viewで使用している 変数が @building になっていませんか? controllerで @buildings (末尾にsがついてる)に値を入れているので、見れていないかもしれないです
fkryu

2017/01/19 09:21

なっています!! buildingsにすればいいのですか??
satoshih

2017/01/19 09:23

controllerでセットするモデルは1つだと思うので、 controller側を @building に変更する方がいいかと思います。
fkryu

2017/01/19 09:24

def show @building = Building.availables.find_by(user_id: params[:user_id]) end に変更して、エラーは出ないのですが、やはりdeleted_flgが1のレコードも表示されてしまいます。
satoshih

2017/01/19 09:34

rails consoleで Building.availables.find_by(user_id: params[:user_id]) を実行して、期待する値が取得できているか確認してみていただいてもいいですか? (params[:user_id] はUserのidに置き換えてください)
fkryu

2017/01/19 09:40

Building.availables.find_by(user_id: params[8])で実行しましたがエラーになってしまいます。。。
satoshih

2017/01/19 09:41

Userのidが 8 なら Building.availables.find_by(user_id: 8) で実行してみてください
fkryu

2017/01/19 09:47

何から何まですみません。。 deleted_flg: falseになっているレコードだけが表示されています。
satoshih

2017/01/19 09:49

了解です。 ではcontrollerでセットした値がどこかで上書きされてると思います。 一旦 viewとcontroller の @building を @buildings に変更すると動くかどうか確認していただけますか?
fkryu

2017/01/19 10:04

@building を @buildings に変更して表示されましたが、内容は変わらずです。。
fkryu

2017/01/19 10:05

変更した内容を画像で添付いたしました。
satoshih

2017/01/19 10:36

viewの current_user.buildings.each を current_user.buildings.availables.each もしくは @buildings.each に変更してみてください
fkryu

2017/01/19 11:40

できました!! かなりいろいろなことがわかり勉強になりました!! 本当にありがとうございます!
guest

0

gem 'kakurenbo' を使うのではダメでしょうか?
カラムにdeleted_at:datetimeを追加するだけで必要な処理は全てやってくれます。
参考

投稿2017/01/19 00:52

moke

総合スコア2241

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

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

0

論理削除なので実際には削除されていないが削除されたように見せかけたいということですよね?
論理削除されたデータはdeleted_flgがtrueになっているので、
deleted_flgがtrueのレコードは画面に表示させないようViewの修正が必要なのではないでしょうか。

投稿2017/01/18 05:20

hn1

総合スコア303

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

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

fkryu

2017/01/18 09:03

はい。そうです。 Viewの修正も必要なのですね。 あまりイメージができずにいます。。
fkryu

2017/01/18 09:09

データベースの値を確認したら削除ボタンを押したidの レコードのeleted_flgが1になってました。
hn1

2017/01/18 09:10

あ、satoshihさんの回答にあるように取得部分で論理削除データを弾いておけばViewの修正は不要でした。 そっちの方がスマートだと思います。
fkryu

2017/01/18 09:15

ありがとうございます。頑張って見ます。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問