ActiveRecord

新建Model


建立一個(gè)新的Model

rails g model category

請(qǐng)注意產(chǎn)生的xxxxx_create_categories.rb文件憨愉,這個(gè)文件記錄了categories表的定義步淹,我們可以給表增加幾個(gè)列

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

我們同時(shí)給events加上一個(gè)外鍵瘪菌,讓這兩張表之間可以關(guān)聯(lián)起來。
新建數(shù)據(jù)表:

rake db:migrate

Model關(guān)聯(lián)


一對(duì)多關(guān)聯(lián)one-to-many

activerecord-relationships-has_many_diagram.png

在上圖中一個(gè)Event可以有多個(gè)Attendee线召,我們新建attendee Model

rails g model attendee name:string event_id:integer

生成數(shù)據(jù)表attendees

rake db:migrate

分別編輯event.rb和attendee.rb建立關(guān)聯(lián)關(guān)系

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對(duì)象并關(guān)聯(lián)到Event上:

e = Event.first
a = Attendee.new(:name => 'ihower', :event => e)
# a = Attendee.new(:name => 'ihower', :event_id => e.id)
a.save
e.attendees   #這是個(gè)數(shù)組
Attendee.first.event

范例二、從Event對(duì)象中建立一個(gè)Attendee

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

范例三、從Event對(duì)象中建立一個(gè)Attendee亏较,并直接存到數(shù)據(jù)庫

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  #一個(gè)個(gè)刪除e的attendees雪情,并觸發(fā)attendee的destroy回調(diào)
e.attendees.delete_all #一次性刪除e的attendees癣朗,不會(huì)觸發(fā)attendee的destroy回調(diào)

一對(duì)一關(guān)聯(lián) one-to-one

activerecord-relationships-has_one_diagram.png

假設(shè)每一個(gè)event都有一個(gè)location,增加一個(gè)Location Model旺罢,其中event_id就是外鍵

rails g model location name:string event_id:integer

然后執(zhí)行rake db:migrate產(chǎn)生數(shù)據(jù)表.
分別編輯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對(duì)象并關(guān)聯(lián)到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對(duì)象建立一個(gè)Location

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

范例三扁达、直接從Event對(duì)象中建立一個(gè)Location

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

多對(duì)多關(guān)聯(lián)many-to-many

activerecord-relationships-many_to_many_1_diagram.png

一個(gè)Event有多個(gè)Group,一個(gè)Group有多個(gè)Event蠢熄。我們可以用一個(gè)額外的Model來建立關(guān)聯(lián)跪解。
我們可以建立如下的model

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

執(zhí)行rake db:migrate產(chǎn)生這連個(gè)數(shù)據(jù)表。
分別編輯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

范例叉讥、建立雙向關(guān)聯(lián)

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建立多對(duì)多關(guān)聯(lián)

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

執(zhí)行rake db:migrate生成數(shù)據(jù)庫表
編輯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

關(guān)聯(lián)參數(shù)

order指定順序

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

串聯(lián)where條件

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

刪除依賴數(shù)據(jù)

class Event < ActiveRecord::Base
  has_one :location, :dependent => :destroy
  has_many :attendees, :dependent => :destroy
end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饥追,隨后出現(xiàn)的幾起案子图仓,更是在濱河造成了極大的恐慌,老刑警劉巖但绕,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件救崔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捏顺,警方通過查閱死者的電腦和手機(jī)六孵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幅骄,“玉大人劫窒,你說我怎么就攤上這事〔鹱” “怎么了主巍?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)懂拾。 經(jīng)常有香客問我煤禽,道長(zhǎng),這世上最難降的妖魔是什么岖赋? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任檬果,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘选脊。我一直安慰自己杭抠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布恳啥。 她就那樣靜靜地躺著偏灿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钝的。 梳的紋絲不亂的頭發(fā)上翁垂,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音硝桩,去河邊找鬼沿猜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛碗脊,可吹牛的內(nèi)容都是我干的啼肩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衙伶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼祈坠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起矢劲,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赦拘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后芬沉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體另绩,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年花嘶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笋籽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椭员,死狀恐怖车海,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隘击,我是刑警寧澤侍芝,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站埋同,受9級(jí)特大地震影響州叠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凶赁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一咧栗、第九天 我趴在偏房一處隱蔽的房頂上張望逆甜。 院中可真熱鬧,春花似錦致板、人聲如沸交煞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽素征。三九已至,卻和暖如春萝挤,著一層夾襖步出監(jiān)牢的瞬間御毅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工怜珍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亚享,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓绘面,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親侈沪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揭璃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容