我有两个表:posts
和post_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
答案 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])