我正在尝试制作一个RoR项目,目前我遇到了模型协会的问题。这可能是由于错误或误解引起的,但在过去的两天里我一直无法找到这个错误或误解。
我希望关联的工作方式如下:
User
=> gapiToken
=> userSession
从技术上讲,我可以打电话给User.find(foo).gapiToken
。
目前我已将其设置为
User
has_many :userSessions
has_one :gapiToken
UserSession
belongs_to :user
GapiToken
belongs_to :user
然而由于某些原因,这并不能解决问题 例如,这段代码:
@user = User.create(gid: foo, permissions: bar)
@gapiToken = @user.gapiToken.create(access_token: foo, token_type: bar, expires_on: bazz, refresh_token: bop)
#^ Error ^ "undefined method `create' for nil:NilClass"
我是否在使用或设置中出错,或两者兼而有之?
答案 0 :(得分:1)
首先,请务必遵循惯例。使用under_scores,而不是camelCase:
User
has_many :user_sessions
has_one :gapi_token
其次,方法@model_instance.association.create
用于one-to-many
关联,而不是one-to-one
关联。它应该是:
@user.create_gapi_token(...)
有关关联API的详细信息,请参阅here。
别忘了索引。
一个基本的经验法则:索引外键,并在连接表上索引两个键。例如:
create_table :user_sessions do |t|
t.belongs_to :user # will result in t.integer :user_id
end
add_index :user_sessions, :user_id
create_table :gapi_tokens, id: false do |t|
t.belongs_to :user
end
add_index :gapi_tokens, :user_id
联接表上的索引示例(注意id: false
和unique: true
):
create_table :users_favourites, id: false do |t|
t.belongs_to :user
t.belongs_to :favourite
end
add_index :users_favourites, [:user_id, :favourite_id], unique: true
阅读about migrations,然后阅读并重新阅读Rails guides。
了解这些惯例很重要,这样你就不会在后来的脚下开枪。