Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails模型中指定可选引用_Ruby On Rails_Ruby On Rails 4_Rails Models - Fatal编程技术网

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