ActiveRecord

新建Model


建立一个新的Model

rails g model category

请注意产生的xxxxx_create_categories.rb文件,这个文件记录了categories表的定义,我们可以给表增加几个列

class CreateCategories < ActiveRecord::Migration
  def change
    create_table :categories do |t|
      t.string :name
      t.integer :position
      t.timestamps
     end

    add_column :events, :category_id, :integer
    add_index :events, :category_id
  end
end

我们同时给events加上一个外键,让这两张表之间可以关联起来。
新建数据表:

rake db:migrate

Model关联


一对多关联one-to-many

activerecord-relationships-has_many_diagram.png

在上图中一个Event可以有多个Attendee,我们新建attendee Model

rails g model attendee name:string event_id:integer

生成数据表attendees

rake db:migrate

分别编辑event.rb和attendee.rb建立关联关系

class Event < ActiveRecord::Base
  has_many :attendees,  :class_name=>"Attendee", :foreign_key=>'event_id'
end

class Attendee < ActiveRecord::Base
  belongs_to :event, :class_name=>'Event', :foreign_key=>'event_id'
end

范例一、建立Attendee对象并关联到Event上:

e = Event.first
a = Attendee.new(:name => 'ihower', :event => e)
# a = Attendee.new(:name => 'ihower', :event_id => e.id)
a.save
e.attendees   #这是个数组
Attendee.first.event

范例二、从Event对象中建立一个Attendee

e = Event.first
a = e.attendees.build(:name => 'ihower')
a.save

范例三、从Event对象中建立一个Attendee,并直接存到数据库

e = Event.first
a = e.attendees.create(:name => 'ihower')

范例四、先建立Attendee再放入Event中

e = Event.first
a =  Attendee.create(:name => 'ihower')
e.attendees << a

范例五、删除

e = Event.first
e.attendees.destroy_all  #一个个删除e的attendees,并触发attendee的destroy回调
e.attendees.delete_all #一次性删除e的attendees,不会触发attendee的destroy回调

一对一关联 one-to-one

activerecord-relationships-has_one_diagram.png

假设每一个event都有一个location,增加一个Location Model,其中event_id就是外键

rails g model location name:string event_id:integer

然后执行rake db:migrate产生数据表.
分别编辑event.rb和location.rb

class Event < ActiveRecord::Base
    has_one :location, :class_name=>'Location', :foreign_key=>'event_id'
end

class Location < ActiveRecord::Base
    belongs_to :event, :class_name=>'Event', :foreign_key=>'event_id'
end

范例一、建立Location对象并关联到Event

e = Event.first
l = Location.new(:name=>'Hsinchu', :event=>e)
#l = Location.new(:name=>'Hsinchu', :event_id=>e.id)
l.save
e.location
l.event

范例二、从Event对象建立一个Location

e = Event.first
l = e.build_location(:name=>'Hsinchu')
l.save

范例三、直接从Event对象中建立一个Location

e = Event.first
l = e.create_location(:name=>'Hsinchu')

多对多关联many-to-many

activerecord-relationships-many_to_many_1_diagram.png

一个Event有多个Group,一个Group有多个Event。我们可以用一个额外的Model来建立关联。
我们可以建立如下的model

rails g model group name:string
rails g model event_groupship event_id:integer group_id:integer

执行rake db:migrate产生这连个数据表。
分别编辑event.rb、group.rb和event_groupship.rb文件

class Event < ActiveRecord::Base
    has_many :event_groupships
    has_many :groups, :through => :event_groupships
end

class EventGroupship < ActiveRecord::Base
    belongs_to :event
    belongs_to :group
end

class Group < ActiveRecord::Base
    has_many :event_groupships
    has_many :events, :through => :event_groupships
end

范例、建立双向关联

g = Group.create(:name=>'ruby tw')
e1 = Event.first
e2 = Event.create(:name=>'ruby tuesday')
EventGroupship.create(:event=>e1, :group=>g)
EventGroupship.create( :event => e2, :group => g )
g.events
e1.groups
e2.groups

不通过第三方Model建立多对多关联

rails g model group name:string
rails g migration create_table_event_groupship

编辑xxxx_ create_table_event_groupship.rb文件

class CreateTrainTeacher < ActiveRecord::Migration  
def up
    create_table :event_groupships do |t|
      t.integer :event_id
      t.integer :group_id
    end
  end
  def down
    drop_table :event_groupships
  end
end

执行rake db:migrate生成数据库表
编辑event.rb和group.rb文件

class Event < ActiveRecord::Base
  has_and_belongs_to_many :group, :class_name=>'Group', :foreign_key=>'event_id',
  :association_foreign_key=>'group_id', :join_table=>'event_grouphips'
end

class Group < ActiveRecord::Base
 has_and_belongs_to_many :event, :class_name=>'Event', :foreign_key=>'group_id',
 :association_foreign_key=>'event_id', :join_table=>'event_grouphips'
end

关联参数

order指定顺序

class Event < ActiveRecord::Base
  has_many :attendees, ->{ order("id DESC") }
end

串联where条件

class Event < ActiveRecord::Base
  has_many :attendees, ->{ where(["created_at > ?", Time.now - 7.day]).order("id DESC") }
end

删除依赖数据

class Event < ActiveRecord::Base
  has_one :location, :dependent => :destroy
  has_many :attendees, :dependent => :destroy
end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,730评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,484评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,668评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,202评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,129评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,853评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,140评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,780评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,060评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,095评论 2 315
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,908评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,663评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,181评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,307评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,582评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,141评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,381评论 2 339

推荐阅读更多精彩内容