如何确保使用rails在数据库中单一输入?

时间:2015-08-15 14:39:17

标签: ruby-on-rails ruby

我已为featured_posts创建了一个表格,has_many posts可以在网站的首页上保留精选帖子。现在我想确保我只在featured_posts创建一个条目。寻找可以存储在数据库中的单例模型条目。什么是rails方式来确保?

由于这将是一个条目表,我认为我的数据库开销将是巨大的,有没有更好的方法来存储这种类型的单一条目?

2 个答案:

答案 0 :(得分:1)

我这样做的方法是在你的帖子表和我的验证器中都有一个is_featured布尔列,确保只有一个这样做为真 - 例如:

class model < ActiveRecord::Model
  validate :validate, on: :create
  def validate(record)
    errors.add('Maximum of one featured post') unless  model.find(:is_featured => true).length == 1
  end

答案 1 :(得分:0)

您可以通过执行以下操作来实现此目的:

<强> featured_posts_controller.rb

def new
    if featured_post.empty?
        # create featured_posts
    else
        redirect_to featured_posts_path
        # or you can throw an error
    end
end

另一种方法是确保没有人可以访问new和create方法:

def FeaturedPostsController < ApplicationController
    before_action :check_post_presence, only: [:new, :create]

    private
    def check_post_presence
        redirect_to featured_posts_path if featured_post.exists?
    end
end

最后,您可以在种子上创建默认的精选帖子,并通过在db/seeds.rb中添加数据来完全删除新的和创建方法:

featured_post = FeaturedPost.create title: "Default Posts"