RoR协会无法正常工作

时间:2014-08-01 23:05:53

标签: ruby-on-rails ruby model associations

我正在尝试制作一个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"

我是否在使用或设置中出错,或两者兼而有之?   

Complete code

1 个答案:

答案 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


关于YOUR CODE

的说明

别忘了索引。

一个基本的经验法则:索引外键,并在连接表上索引两个键。例如:

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: falseunique: 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

了解这些惯例很重要,这样你就不会在后来的脚下开枪。