如果属于该对象属于可选项,您是否应该使用belongs_to?

时间:2015-11-23 04:41:10

标签: ruby-on-rails

如果你有一个帖子对象(用户可以发帖)并且它可能属于或不属于其他东西(如类别),那该怎么办?基本上我希望用户仍然能够发布内容,但他们可以根据需要对其进行分类。如果我把帖子属于all_to类别,那么我觉得如果必须这样,否则会抛出错误。如果它是可选的,我该怎么做?

3 个答案:

答案 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_idnil

有关详细信息,请参阅Rails documentation