Ruby on rails 在Rails模型中指定可选引用
我有一个赞助商模型和一个促销代码模型Ruby on rails 在Rails模型中指定可选引用,ruby-on-rails,ruby-on-rails-4,rails-models,Ruby On Rails,Ruby On Rails 4,Rails Models,我有一个赞助商模型和一个促销代码模型 赞助商可以拥有零个或多个促销代码 促销代码可以有零个或一个赞助商 因此,促销代码应具有对赞助商的可选引用,即赞助商id,该id可能有值,也可能没有值。我不知道如何在Rails中设置它 以下是我目前掌握的情况: # app/models/sponsor.rb class Sponsor < ActiveRecord::Base has_many :promo_codes # Zero or more. end #app/models/shan
- 赞助商可以拥有零个或多个促销代码
- 促销代码可以有零个或一个赞助商
赞助商id
,该id可能有值,也可能没有值。我不知道如何在Rails中设置它
以下是我目前掌握的情况:
# app/models/sponsor.rb
class Sponsor < ActiveRecord::Base
has_many :promo_codes # Zero or more.
end
#app/models/shandor.rb
类发起人
#app/models/promo_code.rb
类PromoCode
#db/migrate/xxxxx_将(赞助商)参考添加到(促销)code.rb
#rails g迁移addSponsorReferenceTopRoomCodes发起人:引用
#运行迁移将赞助商id字段添加到促销代码表中。
类AddSponsorReferenceToPromoCodes
这有意义吗?我的印象是,我必须在我的促销代码模型中使用
属于
,但我没有这方面的依据,只是我还没有看到一个有很多
的有一个
示例。这看起来像是一个简单的有很多且属于关系:
# 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
#app/models/shandor.rb
类发起人
has_-one在这里不合适,因为它会取代has-many:即,你要么有“has_-many”和“belown_-to”,要么有“has_-one”和“belown_-to”。has\u one通常使用不多:通常当您已经有了一个has\u many关系,并且希望将其更改为has\u one,并且不想重新构造现有表时,就会使用has\u one。除非指定验证,否则默认情况下,关系是可选的
属于
是告诉rails这两个对象之间关系的另一半,因此您也可以调用@promo\u-code.sandor
,反之亦然,@sandor.promo\u-code
在rails 5中,属于默认情况下被定义为必需。要使其可选,请使用“可选”选项:)
来源:因此,要清楚,赞助商模型中的
有很多,允许您执行@shandor.promo\u code
,而促销代码模型中的属于,允许您执行@promo\u code.shandor
?不再正确。Rails 5将默认值保持为required:true
,我们需要传递optional:true
以使其成为可选的使我更困惑的是Rails指南关联部分的标题:“”。我把它解释为选择有一个
或属于
。本节实际上是关于两者的使用;我还了解到,属于\u to
总是在带有外键的型号上。谢谢!为了得到更好的解释,请阅读本文。写得很好:简单易懂。这个答案在写的时候是正确的,但现在不是了(但仍然被接受,这可能会引起混淆)。为了不窃取正确答案,如果您正在阅读此文章并使用Rails 5+,请检查Paul Ardeleanu bellow的答案
# 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
# 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
class User
belongs_to :company, optional: true
end