【问题标题】:Rails: two models with one-to-one relationship, one controllerRails:两个具有一对一关系的模型,一个控制器
【发布时间】:2012-03-19 23:03:44
【问题描述】:

我创建了一个带有用户身份验证的简单 web 应用程序。我制作了两个模型:Users 用于用户身份验证,Details 用于其他用户详细信息。它们与one-to-one 关系相关联。我在从同一个控制器更新两个模型时遇到问题。

在这种情况下是否建议使用 one-to-one 关联(我不愿意在一张表中塞入太多字段),如果是,那么通过一个控制器处理两个模型的正确方法是什么?

【问题讨论】:

    标签: ruby-on-rails-3 model-view-controller database-design relational-database rails-models


    【解决方案1】:

    通过 rails cast 检查Nested Model Form Part 1/2。检查一下rails cast,你肯定能弄清楚:)它解释了多对多的关系,小tweeks,你可以一对一地做到这一点。

    一些你可能想看的示例代码:

    class Wiki < ActiveRecord::Base
      has_many :revisions 
    
      has_one :latest_revision, :class_name => "Revision", :order => 'updated_at desc', :limit => 1
      accepts_nested_attributes_for :revisions
    end
    
    class Revision < ActiveRecord::Base
      belongs_to :wiki
    end
    
    
    # new Wiki page, first revision
    def new
      @wiki = Wiki.new
      @revision = @wiki.revisions.build
    end
    
    def create
      @wiki=Wiki.new(params[:wiki])
      @wiki.save
    end
    
    # adding a Revision to a Wiki page
    def edit
      @wiki = Wiki.find(params[:id])
      @revision = @wiki.revisions.build # creating a new revision on edit
    end
    
    def update
      @wiki=Wiki.new(params[:wiki])
      @wiki.save
    end
    
    def show
      @wiki = Wiki.find(params[:id])
      @revision = @wiki.latest_revision
    end
    

    【讨论】:

    • 我忘了补充一点,我已经看过 RailsCasts 的两个部分,我不知道它是否适合我的情况。不过谢谢! (我总是在问 =D 之前搜索 RailsCasts)
    【解决方案2】:

    是的,我们认为使用一对一是合理的,正如您所说的将事情分开。只要您在模型中正确定义了关联,就可以从控制器访问它们。

    用户模型必须有:

    has_one : detail
    

    而且细节模型必须有:

    belongs_to : user
    

    那么,如果您在 'details' 表中有一个名为 'user_id' 的外键,那么一切都会正常工作。

    现在您可以像使用彼此一样访问两个模型

    User.find(1).detail
    

    Detail.find(1).user
    

    您现在可以从它们的两个控制器以相同的方式更新两者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多