这是一个完全是初学者的问题。我很尴尬地问它,但是这里有。
我们有两种模式:Person
和Order
。
Person
具有:first_name, :last_name, :age
属性。 Order
有一个属性:total
。
Person
has_many :orders
和Order
belongs_to :person
。
假设已为两个模型输入了一些数据。
现在,我们在控制台中测试这种关系:
p = Person.first
o = Order.new(total: 100)
o.person = p # this is equivalent to: o.person_id = p.id, yes?
o.save
p.orders
我的问题来自第3行和第5行。
o.person
而不是o
? p.orders
? o.person_id = p.id
究竟是什么意思?我假设它将这些表相互关联起来了吗? 如果这个问题不清楚,请告诉我。
感谢您的帮助!
答案 0 :(得分:2)
问题1:为什么我们要在第3行说“o.person而不是o”?
Order
属于Person
,因此在该行中,您可以通过键入o
来指定拥有该订单o.person = p
的确切人员。 o = p
没有任何意义。
问题2:为什么我们在第5行说“p.orders”?
因为每个Person
都有很多订单,所以您可以输入p.orders
问题3:此外,这个“o.person_id = p.id”究竟是什么意思?我假设它正在将表格相互关联?
是的,这会设置订单的所有者。
啊,我看到了另外一个问题:
o.person = p(这相当于:o.person_id = p.id,是吗?)
并非总是如此,但在大多数情况下。比方说,对于多态关联,它不仅会设置id
,还会设置type
。
答案 1 :(得分:2)
问题1:为什么我们必须说" o.person而不是o"在第3行?
当您声明Order对象belongs_to :person
时,rails在Orders表中创建了一个名为person_id
的列。在Orders表中,列名是Order对象的属性,您可以使用点表示法来引用Order对象的属性,例如: o.total
。
为方便起见,rails允许您将整个Person对象分配给名为person
的Order属性,然后rails提取Person id,rails将ID插入Orders表中的person_id
列。
你的问题有点像问,你为什么要写:
o.total = 10
而不是
o = 10
最后一行没有告诉rails Orders表中该值应该进入哪个列。
表只是列名和值的网格:
Orders:
id total person_id timestamp1 timestamp2
1 10 1 1234567 4567890
2 30 3 12342134 1324123423
3 20 1 1341234324 12341342344
然后如果你写:
o = Order.find(2)
然后将为o分配一个Order对象,其total,person_id,timestamp1和timestap2的值将是id等于2的行中的值。
接下来,如果你写:
o = 10
这是什么意思?这是否意味着o行的所有列都应设置为值10?将第一列设置为10?将最后一列设置为10?写o.person = 10是不是更清楚?
问题2:为什么我们要说" p.orders"在第5行?
检索与Person对象关联的所有订单 - 记住您声明了Person对象has_many
Orders。再一次,这是Rails提供的便利 - 没有声明关联会强迫你写:
target_person_id = 1
@orders = Order.where(person_id: target_person_id)
问题3:此外,这" o.person_id = p.id"是什么意思? 我假设它将这些表相互关联起来了吗?
p
是一个Person对象,例如其中一行:
People:
id first last middle order_id timestamp1 timestamp2
1 Tom Thumb T 1 4567890 1234456
2 Wizard Id of 3 1324123423 123434
3 Tom Thumb T 2 2134234 1234234
如果p是从最后一行值创建的Person对象,则p.id等于3,表示该行:
o.person_id = p.id
相当于:
o.person_id = 3
接下来,o是一个Order对象,Orders表中有一个名为person_id
的列,它是在您声明:belongs_to: person
时创建的,以及行:
o.person_id = 3
指示rails为o' s person_id
列的值插入3。如果o的id是1,那么你得到这个:
Orders:
id total person_id timestamp1 timestamp2
=> 1 10 3 <= 1234567 4567890
2 30 3 12342134 1324123423
3 20 1 1341234324 12341342344