※ 引述《Pagan (test)》之铭言:
: 全新新手自己看网络资料自学中 (Ruby 2.1.5 on Rails 4.2.0)
: 想请教请教, 问题比较初级, 请多包涵
: 一直看不是很懂ActiveRecord某些点
: ※ 引述《ihower (好2ˇ)》之铭言:
: : 这几个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呢?
Ruby中有单复数名词的转换对应
这部分其实有不少错误该不该修的issue XDD
总之就是有个转换表/公式在
所以他知道
(虽然有些错误在www)
: 第二)
: 为何加入has_many, belongs_to就能做到一对多, 多对一的效果?
: 在schema.rb并没有看到t.reference呀?
: 而在migration档案中还需要特定去指定吗? (有些网站说要, 有些说不要)
: 难道不需要去修改DB的data model吗?
: 不太理解背后的运作原理, 因为migration也没有设定的话,
: 做rake db:migration也不会改变data model才对
: 为何可以做到资料关联呢? 至少belongs_to关联的资料表需要增加一个对方id字段啊
has_many, belongs_to只修改了Model class增加了些方法而已
实际上还是需要增加migration去新增对应的字段
不然model只是空有方法但查不到资料
: 第三)
: 目前理解似乎是
: 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 等
其实很想说
你在这边问了问题
有没有试着建过has_many的model试过
其实你的问题如果有试过应该会解决一部份
像migration
如果没对应字段
console测试时就会跳找不到字段的错误
你应该就会知道答案了