基本Rails协会

时间:2015-06-16 22:12:08

标签: ruby-on-rails ruby

这是一个完全是初学者的问题。我很尴尬地问它,但是这里有。

我们有两种模式:PersonOrder

Person具有:first_name, :last_name, :age属性。 Order有一个属性:total

Person has_many :ordersOrder 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行。

  • 问题1:为什么我们必须在第3行中说o.person而不是o
  • 问题2:为什么我们在第5行说p.orders
  • 问题3:这个o.person_id = p.id究竟是什么意思?我假设它将这些表相互关联起来了吗?

如果这个问题不清楚,请告诉我。

感谢您的帮助!

2 个答案:

答案 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