Rails 4:引用表常量的最佳方法

时间:2014-01-01 19:45:30

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我有两个表:postspost_types(每个帖子都与post_type_id相关联)。帖子类型在seeds.rb中预定义,如下所示:

PostType.create!([
    {   :id => 1,
            :name => 'Question' },

    {   :id => 2,
            :name => 'Answer' },

    {   :id => 3,
            :name => 'Note' }
])

在控制器中引用常量的最佳方法是什么?

例如,我目前在帖子#create action:

中对post_type_id进行了硬编码
def create
    @post = current_user.posts.new(
        :post_type_id => 3,
        :title => post_params[:title],
        :body => post_params[:body])
end

3 个答案:

答案 0 :(得分:1)

不要在代码中引用ID。不能保证他们永远都是一样的。

我通常处理此方法的方法是创建一个code列,该列是项目名称的“slugified”版本。因此,在您的情况下,code上有PostType列,“问题”的代码为question。 (要使用带空格的示例,“其他帖子类型”将变为other_post_type。)

然后,在您的控制器中,您可以执行PostType.find_by(code: "question"),或者,如果您想要获得幻想,可以实现post_type :question之类的帮助程序。

哦,如果你不想在每次需要引用帖子类型ID时都进行数据库调用,你总是可以做类似

的事情。
# app/models/post_type.rb

class PostType < ActiveRecord::Base
  QUESTION = find_by(code: "question")
  ANSWER   = find_by(code: "answer")
  NOTE     = find_by(code: "note")
end

然后在控制器中你可以PostType::QUESTION。实际上,我比其他建议更喜欢这种方式。

只是把整个事情搞定:

def create
  @post = current_user.posts.new(
    post_type: PostType::NOTE,
    title: post_params[:title],
    body: post_params[:body]
  )
end

答案 1 :(得分:1)

通常,惯用的方法是查询关联而不是引用ID(坏主意)。如果您的帖子类型中没有额外的逻辑,则可以在帖子类本身中定义一个常量。因此,例如,通过查询:

# Assuming you have post types 'questions' and 'discussions'
# to show one type, you could nest your URLs or pass in a post type /questions/show
@post_type = PostType.find(params[:post_type_id])
@post = Post.new()

否则,描述第二种方法,你可以这样做。

class Post
  POST_TYPES = %w[question discussion]
end

答案 2 :(得分:1)

好吧,我会考虑写一下:

# Post class

def post_type=(post_type)
  post_type = PostType.find_by(name: post_type) if post_type.is_a? String
  super post_type
end

然后你就可以做到:

@post = current_user.posts.new(
   :post_type => 'Note',
   :title => post_params[:title],
   :body => post_params[:body])