在Rails模型中指定可选引用

时间:2014-02-24 16:48:40

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

我有赞助商模型和促销代码模型。

  • 赞助商可以零或更多促销代码
  • 促销代码可以包含零或一个赞助商

因此,促销代码应该有一个对赞助商的可选引用,即sponsor_id可能有也可能没有值。我不知道如何在Rails中设置它。

这是我到目前为止所拥有的:

# app/models/sponsor.rb
class Sponsor < ActiveRecord::Base
  has_many :promo_codes  # Zero or more.
end

# app/models/promo_code.rb
class PromoCode < ActiveRecord::Base
  has_one :sponsor  # Zero or one.
end

# db/migrate/xxxxx_add_sponsor_reference_to_promo_codes.rb
# rails g migration AddSponsorReferenceToPromoCodes sponsor:references
# Running migration adds a sponsor_id field to promo_codes table.
class AddSponsorReferenceToPromoCodes < ActiveRecord::Migration
  def change
    add_reference :promo_codes, :sponsor, index: true
  end
end

这有意义吗?我的印象是我必须在我的促销代码模型中使用belongs_to,但我没有基础,只是因为我没有看到has_many has_one示例。

3 个答案:

答案 0 :(得分:45)

在Rails 5中,belongs_to默认定义为必需。要使其可选,请使用“可选”选项:)

class User
  belongs_to :company, optional: true
end

来源:https://github.com/rails/rails/issues/18233

答案 1 :(得分:2)

这看起来像一个简单的has_many和belongs_to关系:

# app/models/sponsor.rb
class Sponsor < ActiveRecord::Base
  has_many :promo_codes  # Zero or more.
end

# app/models/promo_code.rb
#table has sponsor_id field
class PromoCode < ActiveRecord::Base
  belongs_to :sponsor  # Zero or one.
end

has_one在这里不合适,因为它会取代has_many:即你要么拥有“has_many”和“belongs_to”或“has_one”和“belongs_to”。 has_one通常用得不多:通常在你已经想要改变为has_one的has_many关系时使用它,并且不想重构现有的表。

答案 2 :(得分:1)

除非您指定验证,否则默认情况下关系是可选的。

belongs_to是告诉我们这两个对象之间关系的另一半,因此您也可以调用@promo_code.sponsor,反之亦然,@sponsor.promo_codes