【问题标题】:Rails 3, belongs_to, has one? For 3 models, Users, Instances, BooksRails 3,belongs_to,有一个吗?对于 3 个模型,用户,实例,书籍
【发布时间】:2010-09-08 01:22:16
【问题描述】:

我有以下型号: 用户(id、姓名、电子邮件、instance_id 等...) 实例(id、域名) 书籍(id、name、user_id、instance_id)

在 Rails 3 中,创建新书时,我需要根据 current_user 填充 user_id 和 instance_id。

目前,当我创建新书时分配了 user_id 而不是 instance_id?在 Rails 中需要做什么才能使该字段在图书创作中得到填写?

另外,考虑到我可以在没有填写 instance_id 的情况下创建书籍,rails 不应该出错吗?

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    您似乎通过添加对Instance 模型的引用来对UserBook 模型进行反规范化。除非您有特定原因,否则您可以避免重复引用。

    我会重写你的模型如下:

    class Instance  < ActiveRecord::Base
      has_many :users
      has_many :books, :through => :users, :order => "created_at DESC"
    end
    
    class User < ActiveRecord::Base
      belongs_to :instance
      has_many   :books, :order => "created_at DESC"
    end
    
    
    class Book < ActiveRecord::Base
      belongs_to :user
      has_one    :instance, :through => :user
    end
    

    现在为用户创建一本新书。

    current_user.books.build(...)
    

    获取属于用户实例的书籍列表:

    current_user.instance.books
    

    获取用户创建的书籍列表:

    current_user.books
    

    确保索引users 表中的instance_id 列和books 表中的user_id 列。

    【讨论】:

    • 我刚刚在这里尝试了您的想法。并且 instance_id 没有被填充。在开发日志中它是 NULL
    • 在 book 控制器中,这是我用来创建记录的命令“@book = current_user.books.build(params[:book])” 它为 instance_ID user_id 插入 NULL 正在工作很好。
    【解决方案2】:

    在这种情况下,Rails 只会在以下情况下产生错误:(a) 您的验证失败,或者 (b) 您的数据库外键不被满足。

    什么是实例?即,如果要根据当前用户填充 instance_id,用户的什么属性应该提供它? (instance_id?为什么?)

    【讨论】:

    • 刚刚在stackoverflow.com/questions/3663861/… 看到您的其他问题。实例是连接模型吗?即您在用户和书籍之间有多对多的关系?如果是这样的话……惯例是称它为 user_books 之类的东西——即意思——来描述它是什么。
    • 实例是公司(如 yammer)。用户属于实例。当您创建一本书时,我需要记录 instance_id 和 user_id。 InstanceID 因为公司应该只看到他们的记录,user_id 所以我知道谁拥有该便条。这有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多