在模型中有条件地设置数据库值

时间:2013-06-28 14:31:17

标签: ruby-on-rails activerecord model

基本上:

  • 我想将修订版的title设置为其修订版的帖子标题。
  • 如果新帖子不是修订版(或revision_id),我想将id设置为is_revision = false

到目前为止,我遇到了很多麻烦。任何帮助表示赞赏。

post.rb

class Post < ActiveRecord::Base

has_many :revisions, class_name: "Post", foreign_key: "revision_id"
belongs_to :revision, class_name: "Post"

#...

before_save :post_title

def post_title
  if :is_revision == false
    @revision_id = @post_id
  elsif :is_revision == true
    :revision_id != :post_id
    @title = @revision.title
  end
end

#...

end

更新

我现在能够通过控制器实现这一点。我是否仍然希望在模型中进行这项工作?相同的代码在创建和更新操作下。

posts_controller.rb

def create
    @post = current_user.posts.new(params[:post])

    if @post.save
    if @post.is_revision == false
      @post.revision_id = @post.id
      @post.save
    elsif @post.is_revision == true
      @post.title = @post.revision.title
      @post.save
    end
    end
end

1 个答案:

答案 0 :(得分:0)

我不太明白你的逻辑,也许你应该告诉我们一些背景。

否则,您只是尝试:

class Post < ActiveRecord::Base

has_many :revisions, class_name: "Post", foreign_key: "revision_id"
belongs_to :revision, class_name: "Post"

#...

before_save :set_title_to_revision_title, :if => :is_revision?

# Need to be called after the save because post.id will not be available on the create
after_save :update_revision_id_to_id, :unless => :is_revision?

def is_revision?
  @is_revision
end

def set_title_to_revision_title
  @title = @revision.title 
end

def update_revision_id_to_id
  # just make a quick call to update it i
  update_attribute :revision_id, @id
end

#...

end