我有赞助商模型和促销代码模型。
因此,促销代码应该有一个对赞助商的可选引用,即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
示例。
答案 0 :(得分:45)
在Rails 5中,belongs_to默认定义为必需。要使其可选,请使用“可选”选项:)
class User
belongs_to :company, optional: true
end
答案 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
。