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

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

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

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1424閲覧

deviseで作成したモデルと元々作っていたモデルの紐づけがうまくいかない

morimoriservice

総合スコア23

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2020/11/20 00:39

編集2020/11/20 05:14

タイトルの通りbelongs_toとhas_oneを使用してモデルの紐づけを行おうとしているのですがうまく動いてくれません

・やろうとしていること
rails g devise Account
で作成したAccountモデルとマイクロポストの内容を保存していたPostモデルを紐づけてAccountモデルからPostモデルの内容を呼び出せるようにしたい

account.rb

Ruby

1class Account < ApplicationRecord 2 belongs_to :post 3 accepts_nested_attributes_for :post 4 # Include default devise modules. Others available are: 5 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 6 devise :database_authenticatable, :registerable, 7 :recoverable, :rememberable, :validatable 8 9 #Emailバリデーション 10 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i 11 validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX } 12 #Passwordバリデーション 13 VALID_PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i 14 validates :password, presence: true, length: { minimum: 7 }, format: { with: VALID_PASSWORD_REGEX } 15end

post.rb

Ruby

1class Post < ApplicationRecord 2 has_one :account 3end

上記のように記載してAccount.find(1).Postと入力してもNo method errorとなってしまいPostが見つからないと言われてしまいます
うまくいかない理由や別のやり方について教えていただけると幸いです

20201109075604_create_posts.rb

Ruby

1class CreatePosts < ActiveRecord::Migration[5.1] 2 def change 3 create_table :posts do |t| 4 t.text :content 5 6 t.timestamps 7 end 8 end 9end

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

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

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

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

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

guest

回答1

0

ベストアンサー

恐らくですが、逆になっているように思います。

class Account < ApplicationRecord has_one :post 〜省略〜 end
class Post < ApplicationRecord belongs_to :account end

如何でしょうか?

投稿2020/11/20 01:09

tomtomtomtom

総合スコア563

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

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

morimoriservice

2020/11/20 02:19

回答ありがとうございます。 試してみましたがやっぱりNo method errorになりますね
tomtomtomtom

2020/11/20 02:57

Account.find(1).Post→Account.find(1).post では如何でしょうか?
morimoriservice

2020/11/20 03:56

また別のエラーらしきものが出ましたね >> Account.find(1).post Account Load (0.1ms) SELECT "accounts".* FROM "accounts" WHERE "accounts"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] Post Load (0.5ms) SELECT "posts".* FROM "posts" WHERE "posts"."account_id" = ? LIMIT ? [["account_id", 1], ["LIMIT", 1]] Traceback (most recent call last): 2: from (irb):6 1: from (irb):6:in `rescue in irb_binding' ActiveRecord::StatementInvalid (SQLite3::SQLException: no such column: posts.account_id: SELECT "posts".* FROM "posts" WHERE "posts"."account_id" = ? LIMIT ?)
tomtomtomtom

2020/11/20 04:43

なるほどですね。 post側のマイグレーションファイルに t.references :account, foreign_key: true などの記述があり、 postsテーブルにaccount_idカラムはありますか?
morimoriservice

2020/11/20 05:17

マイグレーションファイルはcreate_table以外特に記載しておりません マイグレーションファイルを追記いたしましたのでご確認お願い致します。 postsテーブルはfind(1)で見ましたがaccount_idカラムはないですね
tomtomtomtom

2020/11/20 13:43

なるほどですね。 簡単に説明しますと、 Account.find(1) でaccounts table からid=1のレコードを取得します。 これに紐づく、postレコードを取得したいのですが、 post tableにaccount_idカラムが無いので 紐付けが出来ない状態だと思います。 間違っていたらすいません。 ですので、まずは、カラムを追加して下さい。 そのためには、 ``` t.references :account, foreign_key: true t.text :content ``` などと記述して、カラムの追加をお願いします。 また、カラムが出来ましたら、 もちろんレコードが必要です。 レコードを登録して再度実行してみて下さい。 如何でしょうか?
tomtomtomtom

2020/11/20 13:47

それと mysqlをご使用でしょうか? GUIはsequel pro でしょうか? GUIを使用すると簡単にデータベースが確認できます^^
morimoriservice

2020/11/23 00:52

ご丁寧な説明ありがとうございます 一度やってみますので結果がわかりましたらまた報告いたします dbについてはsqlite3を使用しており私の環境だとCUIでの確認しかできないそうなのでそれで確認してみます
morimoriservice

2020/11/23 06:22

やってみましたがやっぱり駄目ですね… 調べてみたところadd_index :posts, [:user_id, :created_at]というのも追加するらしくやってみたのですが、結果は変わりませんでした。
tomtomtomtom

2020/11/24 11:28

そうですか お力になれずに申し訳有りません。 githubのurlなど分かればこちらのlocalにダウンロードして検証してみたいところですが、、、 add_indexはテーブルにカラムを追加するメソッドです。 https://railsdoc.com/page/add_index やはりpostsテーブルにuser_idのカラムを追加することは間違いないみたいですね
tomtomtomtom

2020/11/25 04:11

只今検証中ですが、 気づいた点 ・add_index :posts, [:user_id, :created_at] ↑これは ・add_index :posts, [:account_id, :created_at] だと思います。morimoriさんはuserではなくaccountモデルなので
tomtomtomtom

2020/11/25 04:12

それとcreated_atは紐付けには関係ないように思います^^
morimoriservice

2020/11/25 04:49

ありがとうございます! 指摘箇所については修正いたします
tomtomtomtom

2020/11/25 14:21

さて、こちらでは以下の方法で実現できました。 まずpostのマイグレートファイル ``` class CreatePosts < ActiveRecord::Migration[5.1] def change create_table :posts do |t| t.text :content t.references :account, foreign_key: true t.timestamps end end end ``` ↑これにして、rails db:migrate:resetを実行 ※dbがからになるので注意。 postコントローラー ``` Post.create(content: params[:text],account_id:current_account.id) ``` これで、account_idも一緒に保存しないと保存できません。 最後にaccountモデル。 ``` has_one :post,dependent: :destroy ``` ↑postにforeign_keyを設定したのでdependent: :destroyをしてやらないと消せません。 恐らくこれで出来上がると思います。 如何でしょうか?
morimoriservice

2020/11/26 00:51

今やってみたのですが無事紐づいてくれました!! 本当にありがとうございます! ただ、アカウント毎の投稿内容をtopページで表示させようとすると最初にサインインしたアカウント以外でエラーになってしまっていてなかなか解決できないので自分で解決できなそうでしたらまた質問させていただくと思います 今回の件は調べても正解がなかったので本当に助かりました、ありがとうございます。
tomtomtomtom

2020/11/26 05:07

解決できてホッとしました^^ またよろしくおねがいします^^ ※コントローラーではストロングパラメーターを使ったほうがよいですよ^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問