kawasaki-shohei/household_account_book

change how to register your partner

Closed this issue · 12 comments

ユーザーにLINEみたいに一意に決まってるID持たせて、そのIDでパートナーを検索
→存在しない場合はメールで招待
→パートナーが登録するまでお待ちください。

現状のパートナー登録画面に招待機能を追加する形で対応しようと思います。

メールアドレスがユニークなので、それを利用しようかと思っていますが、「ユーザを一意に特定するID」を新たに追加した方がいいでしょうか?

招待機能ということは、メールを送るってことですよね?
まだメーラーを導入してないから、その環境を作るってなると大変。(ただ、無料のものがあるなら導入したい)
僕はメールアドレスはタイピングが大変だからと思って、IDを持たせようと思ったけど、
この場合ってメールアドレスを使ったほうがいいような気がしてきた。
仮にユーザーID作っても、その他に使いようないしね。
なんか中途半端にアサインしてしまって申し訳ない。

ただ、現状だと、パートナーをメールアドレスで探してあったら、即登録!になってるから変えたいと思いました。
確認画面とかをかますのが自然なのかな?

メールアドレス検索 -> 確認 -> 招待完了 という感じでしょうか。
招待はサイト内で完結させてもいいかもですね。

メールアドレス検索 -> 確認 -> 招待完了 という感じでしょうか。

そういう感じです。
メーラー導入するまでは、パートナーが登録されてない場合は、「パートナーに登録してもらってください」って。メッセージ出しておこうか?

てか、partnersテーブルというものがあるんだけど、、、、、
今更だけど、、、すんごいこれが要らない気がしてきた。
usersテーブルに外部キー制約なしでreference型でpartner_idを持たせればいいだけな気がしてきた。
ちょっとやってみます。

だめでしたw

#migration_file
def change
    add_reference :users, :partner, index: true, references: :users
  end
#User.rb
has_one :partner, class_name: 'User'    #追記

# rails console
user = User.first
user.assign_attributes(partner_id: 2)
user.save(validate: false)

partner_idを登録しようとすると
NameError: uninitialized constant User::user
というエラー。
同じテーブルは参照できないのかな?

できたーーー
アソシエーションが間違ってましたw
has_one じゃなくて belongs_toでした。

# User.rb
belongs_to :partner, class_name: 'User'  

これで

#rails c -e test
[1] pry(main)> user = User.first
  User Load (0.4ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 1]]
=> #<User:0x007fe869a38a50
 id: 1,
 name: "test-user1",
 email: "user1@gmail.com",
 password_digest:
  "$2a$04$EIFZjWmz2r5yTUWDrTGqN.nOhV0Eczs20v7MDvdUgIjtuXcP983Sm",
 created_at: Sat, 18 Aug 2018 21:02:40 JST +09:00,
 updated_at: Sat, 18 Aug 2018 21:02:40 JST +09:00,
 allow_share_own: false,
 partner_id: nil>

[2] pry(main)> user.partner
=> nil

[3] pry(main)> user.assign_attributes(partner_id: 2)
=> nil

[4] pry(main)> user.save(validate: false)
   (1.2ms)  BEGIN
  SQL (1.6ms)  UPDATE "users" SET "updated_at" = $1, "partner_id" = $2 WHERE "users"."id" = $3  [["updated_at", "2018-08-19 10:31:14.236434"], ["partner_id", 2], ["id", 1]]
   (0.6ms)  COMMIT
=> true

[5] pry(main)> pp user
#<User:0x007fe869a38a50
 id: 1,
 name: "test-user1",
 email: "user1@gmail.com",
 password_digest:
  "$2a$04$EIFZjWmz2r5yTUWDrTGqN.nOhV0Eczs20v7MDvdUgIjtuXcP983Sm",
 created_at: Sat, 18 Aug 2018 21:02:40 JST +09:00,
 updated_at: Sun, 19 Aug 2018 10:31:14 JST +09:00,
 allow_share_own: false,
 partner_id: 2>

[6] pry(main)> user.partner
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
=> #<User:0x007fe8677ed720
 id: 2,
 name: "test-user2",
 email: "user2@gmail.com",
 password_digest:
  "$2a$04$MtOH.1SkaB6sBuK2gjP2x.nW9mJJB6IlrnfAVXisnChBKgRwTElSm",
 created_at: Sat, 18 Aug 2018 21:02:40 JST +09:00,
 updated_at: Sat, 18 Aug 2018 21:02:40 JST +09:00,
 allow_share_own: false,
 partner_id: nil>

下記の処理ができたので、stagingとmasterにブランチにあげてます。
・usersにpartnerカラムの追加
・partnersテーブルのdrop
・partnerのmodel, controller, viewsの消去
・partnerに関連するメソッドをfix
・users_controllerにpartner登録を追加

made enable to work without partner model and controller
chaging everything related with Partner model
drop partners table and deleted everything belonging to partners model and add partner_id to users

でも、partner_idなしで登録できなくなってしまった。
たぶんbelongs_toのせい。

修正できました。rails5からは belogns_to のアソシエーションつけると、その外部キーなしでは登録できなくなるのでした。でもoptional: true というオプションとつけると入力できるようになります。
これははまる方多いそうなので、覚えておくといいと思います。
あと、partner_idにモデル側とDB側にユニーク制約をつけました。
ですが、コントローラでその分岐がありません。
パートナーを検索して、すでに登録されているという気まずいパターンですねww
こちらのissueはusers_controllerに変更を加えていくと思うので、その分岐を加えていただけたらと思います。

このときよりはかなり仕様が変わったのでクローズ