Ruby on rails Rails如何维护同一类型的has\u-one关系和has\u-many关系
在我目前正在进行的一个项目中,我注意到,如果我有一个Ruby on rails Rails如何维护同一类型的has\u-one关系和has\u-many关系,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,在我目前正在进行的一个项目中,我注意到,如果我有一个有一个和一个有多个引用相同类型的对象,那么Rails可以区分被引用为有一个的对象和在后续控制台会话中被引用为有多个的对象 例如,以以下两种模型为例: class Foo has_many :bars has_one :bar end class Bar belongs_to :foo end 如果我创建了一个类型为Foo的新记录,其中包含一组Bar实例和Foo#Bar属性中的一个单独的Bar实例,然后重新启动控制台,我会发现原
有一个和一个有多个引用相同类型的对象,那么Rails可以区分被引用为有一个的对象和在后续控制台会话中被引用为有多个的对象
例如,以以下两种模型为例:
class Foo
has_many :bars
has_one :bar
end
class Bar
belongs_to :foo
end
如果我创建了一个类型为Foo
的新记录,其中包含一组Bar
实例和Foo#Bar
属性中的一个单独的Bar
实例,然后重新启动控制台,我会发现原始Foo
实例仍然将单独的Bar
实例引用为Bar
。这个单独的实例现在出现在由Foo#Bar
返回的Bar
实例列表中。这是正常的行为还是有点侥幸?这是正常的行为,因为有很多
和有一个
在DB中有相同的概念,它们是有0…n(零对多)其他的关系
但含义不同:
有一个
的意思是0..1
,否则,有很多个
就是0..n
,你看n可能等于1
- 此外,
有一个
,有许多
帮助rails了解您在为查询做什么,例如:
Foo.first.bar
=> SELECT "bars".* FROM "bars" WHERE "bars"."foo_id" = $1 LIMIT 1 [["foo_id", 234]]
Foo.first.bar(无限制1)
您可以尝试以下方法:
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,则表示您正在查找1对1关系。如果酒吧有一个foo_id,那么它将是一对多
这需要完成,因为Foo有一个酒吧关系。你这样做想实现什么?这可能会导致bar
关联产生不可预测的结果,因为您无法100%确定它将从集合中返回哪个记录。这正是我所怀疑的,我已经开始为我的has\u one关系定义不同的列和外键。我只是觉得有趣的是,这个框架似乎能记住哪个是哪个,所以我想我应该请专家们解释一下。它可能已经被证明是有用的-如果你不问,你不知道!我同意这样问是有帮助的。我真的很好奇你想要实现什么,因为我倾向于发现这揭示了如何最好地回答这样一个问题。我正在开发一个存储人们朋友详细信息的应用程序——有点像美化的联系人列表。它是更大应用程序的一部分。我想重用我为存储联系人详细信息而编写的类来存储用户的详细信息。所以我想有一个has\u-one指的是一个人的实例,用户的详细信息,还有一个has\u-many指的是其他人的实例,用户的联系人。这些朋友的详细信息像社交网络吗?在中,您有一个用户,他有一个朋友,他也是一个用户?如果是这样的话,那就需要以不同的方式进行建模。如果您的某个用户的联系人不一定是其他用户,那么您需要对其进行稍微不同的建模。
class Foo
has_many :bars
end
class Bar
belongs_to :foo
belongs_to :foo_single, :foreign_key=>"foo_single_id", :class_name=>"Foo"
end