【问题标题】:RoR Associations not workingRoR 协会不工作
【发布时间】:2014-08-01 23:05:53
【问题描述】:

我正在尝试制作一个 RoR 项目,但我目前遇到了模型关联问题。这可能是由错误或误解引起的,但在过去 2 天中,我无法找到此错误或误解。

我希望关联像这样工作:

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

【问题讨论】:

    标签: ruby-on-rails ruby model associations


    【解决方案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

    了解惯例很重要,这样你以后才不会自爆。

    【讨论】:

    • 吃完饭回来会接受,现在不让了,谢谢
    • @NoahHuppert 你能用t.string :gid 解释一下你的users 表吗?
    • 感谢您的更新。我想我在何时使用骆驼和下划线之间有点混淆了。对于 GapiToken,你可以让用户 id 成为 apiToken 的主键吗?
    • gid 是 Google 用户 ID。
    • @NoahHuppert 我认为将gid 与用户的id 分开是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    相关资源
    最近更新 更多