如果你有一个帖子对象(用户可以发帖)并且它可能属于或不属于其他东西(如类别),那该怎么办?基本上我希望用户仍然能够发布内容,但他们可以根据需要对其进行分类。如果我把帖子属于all_to类别,那么我觉得如果必须这样,否则会抛出错误。如果它是可选的,我该怎么做?
答案 0 :(得分:2)
除非您在帖子中添加类似后续验证的内容,否则不会产生错误:
validates :category, presence: true # it ensures that category must be present
只是category_id
在那个不存在类别的帖子实体中将是零,没有任何错误。如果有10s和100s的冗余列,那么我认为最好去database normalization。
答案 1 :(得分:1)
belongs_to
告诉Rails数据库中可能存在相关记录。它完全是可选的。如果用户没有选择类别,那么Rails将保存category_id = nil,并且特定帖子没有类别。就像你说它应该有用。
只有确保在显示类别时,@post.category
对象不包含AcitveRecord对象,并且您无法像@post.category.name
那样调用任何方法,如果这样做,它将抛出一个&# 39; nill'错误。
如果您想显示类别名称,您应该这样做:
@post.category.name if @post.category.present?
答案 2 :(得分:0)
我认为,您可以通过在has_many
模型中为Post
添加Category
关联范围,以更好的方式处理这种情况:
class Category < ActiveRecord::Base
has_many :posts, -> { where 'category_id IS NOT NULL' }
end
class Post < ActiveRecord::Base
belongs_to :category
end
在Category
模型中,您可以有条件地为has_many
添加Post
关联,如上所示。这样,您就可以避免关联中不属于该类别的帖子,例如category_id
为nil
。
有关详细信息,请参阅Rails documentation。