作者Pagan (test)
看板Ruby
标题Re: [问题] Rails中AR Associations的单复数问题
时间Fri Feb 27 23:57:08 2015
全新新手自己看网路资料自学中 (Ruby 2.1.5 on Rails 4.2.0)
想请教请教, 问题比较初级, 请多包涵
一直看不是很懂ActiveRecord某些点
※ 引述《ihower (好2ˇ)》之铭言:
: ※ 引述《tonytonyjan (南洋大兜虫)》之铭言:
: : 环境:
: : Rails ~> 3.0.0
: : 状况:
: : 在阅读文章、书籍的时候,看到每个人都说
: : has_one, belongs_to後面要放单数的association_id
: : has_many, has_and_belongs_to_many及:through後面要放复数
: : 但是皆知其然不知其所以然
: : 那些association_id的域名来自哪里?
: : 是DB中已存在的table name吗?还是已存在的model name呢?
: 这几个association方法都有参数是 :foreign_key 和 :class_name
: 这两个值通常不需要设定, 因为rails会依照惯例帮你设定
: belongs_to :user 等同於
: belongs_to :user, :foreign_key => :user_id, :class_name => "User"
第一)
对belongs_to的部分是看懂了, 依照惯例会对应到class的名称
但我有个部分不太懂, 假如是has_many 而刚好复数的字眼不是单纯加上s的呢?
例如 (看国外范例讲的 但没看懂为什麽)
在article.rb中
belongs_to :category #这部分理解了惯例
在category.rb中
has_many :categories #这部分不理解为何Rails会知道对应到Category class呢?
第二)
为何加入has_many, belongs_to就能做到一对多, 多对一的效果?
在schema.rb并没有看到t.reference呀?
而在migration档案中还需要特定去指定吗? (有些网站说要, 有些说不要)
难道不需要去修改DB的data model吗?
不太理解背後的运作原理, 因为migration也没有设定的话,
做rake db:migration也不会改变data model才对
为何可以做到资料关联呢? 至少belongs_to关联的资料表需要增加一个对方id栏位啊
第三)
目前理解似乎是
a) 对资料物件(model)而言, 假如是资料属性attribute, 则是透过建立migration档案
设定attributes, 在rake db:migrate时, 更新资料库data model, 并且生成一份最新
的schema.rb档, 类似资料库的DDL
b) 对资料物件而言, 假如是物件之间的关联属性, 则透过XXModel.rb去做设定维护,
但设定维护的has_many :YYs这些方法,
是Rails自动在XXmodel.rb中加入一个method YYs可以去关联汲取YY的资料
但是这些关联都是写在callback内, 并没有真正的在对方的资料表建立FK
(没有透过db fk constraint, 只是栏位ID值本身是对应的)
但还是不太理解为何Rails会自动找到对应的资料表? 特别像是has_many :categories
(难道像是这样的名词就需要手动设定t.references?? 有点被多个范例搞混了)
也还是不太理解为何资料表如何被增加栏位,
因为并没有看到has_many/belongs_to的关联法需要做db:migrate
到底是如何影响database physical schema的呢?
恳请赐教!! 看许多网站资料众说纷纭, 不知何者为真, 感谢!!
(是data warehouse背景, 写SQL习惯了, 越看ActiveRecord越不懂,
实在很需要各位解惑, 网上各种答案都有很糊涂, 谢谢)
: 至於DB的table叫啥,依照惯例则是Model名字的复数:
: class UserJob < ActiveRecord::Base
: end
: 等同於
: class UserJob < ActiveRecord::Base
: set_table_name :user_jobs
: set_primary_key :id
: end
: 因此, 如果你通通依照rails惯例, 你就不需要写 set_table_name,
: set_primary_key, :foreign_key, :class_name....这些参数了, 这就叫
: 惯例胜於设定(Convention Over Configuration)原则
: : 我如果故意单数写复数,复数写单数,仍可以运作吗?
: no, 除非你手动指定 :foreign_key 和 :class_name 等
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.224.163.2
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Ruby/M.1425052630.A.6FA.html