在我正在进行的项目中,我注意到如果我有has_one
和has_many
引用相同类型的对象,那么Rails可以区分被引用为{的对象{1}}以及后续控制台会话中引用为has_one
的对象。
例如,采用以下两种模式:
has_many
如果我在class Foo
has_many :bars
has_one :bar
end
class Bar
belongs_to :foo
end
属性中创建了一个Foo
类型的新记录,其中包含一组Bar
个实例和一个单独的Bar
实例,然后重新启动我找到的控制台原始Foo#bar
实例仍将单独的Foo
实例引用为Bar
。该单独的实例现在显示在bar
返回的Bar
实例列表中。这是正常行为还是有点侥幸?
答案 0 :(得分:0)
这是正常行为,因为has_many
和has_one
在DB中具有相同的概念,它们是0 ... n(零到多)其他的关系!
但不同的意思是:
has_one
的含义为0..1
,否则has_many
为0..n
,您会看到n maybe equal 1
has_one
& has_many
帮助栏了解您正在为查询做些什么,例如:<强> Foo.first.bar 强>
=> SELECT "bars".* FROM "bars" WHERE "bars"."foo_id" = $1 LIMIT 1 [["foo_id", 234]]
Foo.first.bars (不限制1)
=> SELECT "bars".* FROM "bars" WHERE "bars"."foo_id" = $1 [["foo_id", 234]]
答案 1 :(得分:0)
您可以尝试这样的事情:
class Foo
has_many :bars
end
class Bar
belongs_to :foo
belongs_to :foo_single, :foreign_key=>"foo_single_id", :class_name=>"Foo"
end
通过这样做,你会将“条形”分开。如果一个条形图有一个foo_single_id,则表示您正在查找一对一的关系。如果Bar有一个foo_id,那么它就是1对多。
需要为Foo has_one栏关系完成。