2

ユーザーによって作成された Challenge というモデルがあります。それに伴う難易度もあります。チャレンジを作成して作成者 (ユーザー) と難易度を渡すと、難易度アソシエイトは機能しますが、作成者 (ユーザー) は機能しません。最も奇妙な部分は、Challenge オブジェクトを見ると、関連付けられている Author キーが表示されることです。

challenge = Challenge.first
challenge.author (prints Nil) #Doesn't even run a Query

次のコードを使用してチャレンジを作成すると、user_id が Nil になります。

user = User.find(1)
diff = Difficulty.find(1)
Challenge.create(:author => user, :difficulty => diff, :title => "My Challenge")

このコードを使用してチャレンジを作成すると、ユーザーはチャレンジとの関係を取得し、チャレンジはユーザーの user_id を取得します。ただし、ユーザーからチャレンジにしか移動できません。ユーザーへのチャレンジは Nil を返します。

user = User.find(1)
diff = Difficulty.find(1)
chall = Challenge.create(:difficulty => diff, :title => "My Challenge")
user.authored_challenges << chall

ここに私のモデルとテーブルがあります

# Models
class User < ActiveRecord::Base
  has_many :authored_challenges, :class_name => "Challenge"
  attr_accessible :display_name, :authored_challenges   
end

class Reward < ActiveRecord::Base
  has_many :challenges
  attr_accessible :name, :value, :challenges
end

class Challenge < ActiveRecord::Base
  belongs_to :reward
  belongs_to :author, :class_name => "User"
  attr_accessible :title, :description, :reward, :author
end

# Tables
create_table :users do |t|
  t.string :display_name
  t.timestamps
end

create_table :rewards do |t|
  t.string :name
  t.float :value
  t.timestamps
end

create_table :challenges do |t|
  t.integer :user_id
  t.integer :reward_id
  t.string :title
  t.string :description
  t.timestamps
end
4

2 に答える 2

3

によると: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html外部キーは次のようになります:

:foreign_key => :author_id

フィールドを追加することを忘れないでください。幸運を!

于 2012-05-14T02:13:11.270 に答える
1

やってみました:

belongs_to :author, :class_name => "User", :foreign_key => :user_id

Railsのドキュメントから:

慣例により、Rails は、このモデルの外部キーを保持するために使用される列が、サフィックス _id が追加された関連付けの名前であると想定します。:foreign_key オプションを使用すると、外部キーの名前を直接設定できます

ドキュメントに示されている例は、あなたが持っているものと非常によく似ています:

class Order < ActiveRecord::Base
  belongs_to :customer, :class_name => "Patron", :foreign_key => "patron_id"
end
于 2012-05-14T01:33:04.320 に答える