【问题标题】:rails, has_one, build_#{association}, accepts_nested_attributes_forrails,has_one,build_#{association},accepts_nested_attributes_for
【发布时间】:2009-11-27 11:41:56
【问题描述】:

我正在尝试开发一个带有版本历史的 wiki。

我的计划是:每次我编辑 wiki 内容时,都应该将其另存为新内容。

目前,我有两个模型,Wiki 和 WikiContent,其中包含以下代码:

class Wiki < ActiveRecord::Base

  has_many :wiki_contents 

  has_one :current_wiki, :class_name => "WikiContent"
  accepts_nested_attributes_for :current_wiki

  has_one :new_content, :class_name => "WikiContent"
  accepts_nested_attributes_for :new_content

end
class WikiContent < ActiveRecord::Base
  belongs_to :wiki
end

Wiki 模型有一个字段 current_id,用于知道哪些内容是当前内容。

在我运行的 Wiki 控制器中

def new
  @wiki.build_current_wiki
end
def create
  @wiki=Wiki.new(params[:wiki])
  @wiki.save
  @wiki.current_id=@wiki.current_wiki.id
end

但每当我尝试运行时:

def edit
  @wiki.build_new_content
end

它将 NULL 分配给 current_wiki.wiki_id。

我该如何解决这个问题? 还是有其他方法可以让它发挥作用?

【问题讨论】:

标签: ruby-on-rails has-one


【解决方案1】:

我认为,如果你重新设计你的模型,你可能会更轻松。

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

一个 Wiki 有许多修订版,但只有一个最新修订版。现在您不必管理current_id,因为latest_revision 协会会为您处理这些。

【讨论】:

  • 谢谢,显示的代码不起作用,因为 has_many 的“构建”语法与 has_one 的语法有点不同(f.ex.@wiki.build_revision 必须是 @wiki.revisions.build),但是切换到 has_many 并使用“updated_at desc”的想法让我前进了几步。不过,我会保留 current_id,这会使一些查询更轻松。
猜你喜欢
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多