4

seed.rb特にテーブルのリレーションシップが関係している場合、を使用してデータベースをシードするのに問題があります。

コードのサンプルを次に示します。

# seed.rb
user = User.find_or_create_by_login(  
  :login => "myname",  
  :email => "myname@gmail.com",  
  :user_type => "Admin",  
  :password => "admin",  
  :password_confirmation => "admin")

project = Project.find_or_create_by_user_id(
  :user_id => user.id,
  :name => "Test Project")

プロジェクトが作成されると (上で省略した他の無関係なパラメーターと共に)、user_id は空です。どうすればこれを機能させることができますか?


これは、とても単純なもので私が見た中で最も奇妙な動作です。私のシード ファイルには、約 8 つのテーブルが作成されており、いくつかは 3 ~ 4 レベルの深さでネストされています (つまり、ユーザー has_many プロジェクト、プロジェクト has_many タスクなど)。

上記のようにユーザーを呼び出し、その後複数回user参照すると、一度しか機能しません! user.id新しい各レコードが作成される前に [user.reload] を追加しようとしましたが、役に立ちませんでした。これが誰にとっても意味があるとは思いませんが、ここに何か可能性はありますか? 皆さんありがとう。

4

5 に答える 5

5

私は問題が何であるかを理解しました。attr_accessibleデータが入力されていないフィールドは、それぞれのモデルで明示的にリストされていませんでした。リストされたフィールドは正しく保存されていました。

皆様には大変お世話になりました。

于 2010-12-31T14:21:01.277 に答える
3

コードは適切で、 の正しい構文ですfind_or_create。他の人が言っているように、最も可能性の高い問題は、ユーザーが無効であることです。ユーザーが無効な場合に電話をかけよuser.reloadうとすると爆発するため、問題がより明確になりますが、それから得られるエラーは役に立たないでしょう(それなしではユーザーを見つけることができないとうめきますID)。

残念ながらfind_or_create、無効な場合に例外を発生させる bang メソッドとしては機能しないため、ユーザーを作成しようとした後にエラーを発生させてエラーを出力するのがおそらく最善の方法です。

user = User.find_or_create_by_login(:login => "myname")
raise "User is invalid: #{user.errors.full_messages}" unless user.valid?
于 2010-12-31T14:19:30.767 に答える
0

ユーザーが保存されていますか? find_or_create_by_XXの正しい構文はだと思いますBlog.find_or_create_by_title("Some Blog")。より多くのデータを渡す必要がある場合は、find_or_initialize最初に使用し、その後で他のデータを個別に設定する必要があります。

大まかに関連するスレッド: Rails find_or_create by multiple attributes?

- 編集

データをハッシュとして渡すことfind_or_create_by_XXもうまくいくようです。ドキュメントは、ここの「動的属性ベースのファインダー」の下にありますhttp://apidock.com/rails/v3.0.0/ActiveRecord/Base

于 2010-12-31T13:42:39.103 に答える
0

User.find_or_createの代わりにこの使用を試してくださいUser.find_or_create_by_login。ユーザー オブジェクトが保存されていないようです。または、user.id を割り当てる前に user.reload を実行します

user = User.find_or_create(  
  :login => "myname",  
  :email => "myname@gmail.com",  
  :user_type => "Admin",  
  :password => "admin",  
  :password_confirmation => "admin")

[user.reload]

project = Project.find_or_create_by_user_id(  :user_id => user.id,
  :name => "Test Project")
于 2010-12-31T13:44:34.983 に答える
0

ユーザーの作成に成功しましたか? もしそうなら..そうでなければuser.reloadを試してください。それはおそらくエラーです

于 2010-12-31T13:40:47.773 に答える