Rails:两个具有一对一关系的模型,一个控制器

时间:2012-03-19 23:03:44

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

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

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

2 个答案:

答案 0 :(得分:3)

通过rails cast检查Nested Model Form Part 1/2。检查铁轨铸造,你一定可以弄清楚:)它解释了很多很多关系,小小的推文,你可以做到一对一。

您可能希望看到一些示例代码:

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

答案 1 :(得分:-1)

是的,使用一对一我们是合理的,正如你所说的那样保持分隔。从控制器访问它们时,只要您在模型中正确定义了关联,就应该能够执行它们。

用户模型必须具有:

has_one : detail

并且Detail模型必须具有:

belongs_to : user

然后如果你在'details'表中有一个名为'user_id'的外键,那么一切都应该可以正常工作。

现在您可以像

一样互相使用这两个模型
User.find(1).detail

Detail.find(1).user

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