數據庫查詢,
設MemLevel是個數據庫表:
=> MemLevel.where(code:'V1').name
=> #<ActiveRecord::Relation [#<MemLevel id: 2, code: "V1", name: "白銀工長", score: 2000, created_at: "2017-06-08 01:02:03", updated_at: "2017-07-25 07:38:44", level: "1">]>
從代碼可知獲得的是鍵值為'V1'的、且為ActiveRecord::Relation類型的==數組==,[#<MemLevel...>]就是數組,數組里的#<MemLevel...>就是該數組的值(準確來說是哈希),這值說白了就是MemLevel表里的一行記錄,從代碼中知道該表里鍵值為'V1'的就一條記錄。
所以在這里要想獲得表里頭:鍵code值為'V1'對應的鍵name值,得在獲得上面的數組后,提取數組里的某一條記錄(通常提取第一個就行),然后再從記錄(哈希)挑出name的值,如下所示:
=> MemLevel.where(code:'V1').first
=> #<MemLevel id: 2, code: "V1", name: "白銀工長", score: 2000, created_at: "2017-06-08 01:02:03", updated_at: "2017-07-25 07:38:44", level: "1">
=>MemLevel.where(code:'V1').first.name
=> "白銀工長"
Ruby on Rails,ActiveRecord和ActiveRelation:
-
active record
注意是小寫而且是兩個單詞。是一種編程模式,特點是一個模型類對應關系型數據庫中的一個表,而模型類的一個實例對應表中的一行記錄。這使得我們能夠方便地將數據庫中的記錄轉化為實體對象,或將實體對象持久化到數據庫中,以便業務代碼中處理實體對象之間的關系而不再是數據庫表記錄之間的關系。
-
ActiveRecord
一個單詞。是Rails對于這種模式的一種實現,以便我們更快速的實現對象在關系數據庫中的持久化開發工作。業務中的實體類繼承ActiveRecord,便能方便的將數據庫中的記錄與實體對象之間進行轉換。更近一步,ActiveRecord是一種能夠讓你的實體對象變“聰明”的幫手,它能夠根據自己的結構推知當前的數據庫結構并能夠和其交互以達到對象的增刪改查。
比如說,對于某一個繼承了ActiveRecord的User對象來說增刪改查操作變得非常方便。我們一般來說都不用關心隱藏在后面的SQL語句編寫工作,也就是說SQL語句對我們使用來說是完全透明的。
#insert
user=User.new
user.user_name="abbuggy"
user.save
#update
user.user_name="terry"
user.save
#delete
user.delete
-
ActiveRelation
這是Rails3版本中增加入的內容,是一個對象關系算法解析器。ActiveRelation能夠將復雜的查詢分解為簡單的逐步調用,通過一系列基于上一次調用的結果上的調用完成復雜的查詢,而不用去關心具體的SQL語句編寫工作。大多數情況下ActionRelation是隱藏在幕后的,不被我們直接使用,我們能看到的只是對于ActionRecord的操作。
Rails布局和渲染
-
理解 yield
- 在rails布局中,yield標明一個區域,渲染的視圖會插入這里。最簡單的情況是只有一個 yield,此時渲染的整個視圖都會插入這個區域.
<html>
<head>
</head>
<body>
<%= yield %>
</body>
</html>
- 布局中也可以標明多個區域,這個就需要使用具名yield,然后使用content_for方法。對于未命名的yield,視圖的主體就會插入到未命名的yield區域。
#主布局 application.html.erb
<html>
<head>
<%= yield :head %>
</head>
<body>
<%= yield %>
</body>
</html>
#子頁面(e.g: app/views/admin/stores/index.html.erb)
<% content_for :head do %> #插入到主布局的 <%= yield :head %>位置
A simple page
<% end %>
<p>Hello, Rails!</p> #插入到主布局的 <%= yield %>位置
#最后生成的html
<html>
<head>
<title>A simple page</title>
</head>
<body>
<p>Hello, Rails!</p>
</body>
</html>
-
理解layouts
查找布局:
查找布局時,Rails 首先查看 app/views/layouts 文件夾中是否有和控制器同名的文件。例如,渲染 PhotosController 控制器中的動作會使用 app/views/layouts/photos.html.erb(或 app/views/layouts/photos.builder)。如果沒找到針對控制器的布局,Rails 會使用 app/views/layouts/application.html.erb 或 app/views/layouts/application.builder。如果沒有 .erb 布局,Rails 會使用 .builder 布局(如果文件存在)。Rails 還提供了多種方法用來指定單個控制器和動作使用的布局。
指定控制器所用布局:
在控制器中使用 layout 方法,可以改寫默認使用的布局約定。例如:
class ProductsController < ApplicationController
layout "inventory"
#...
end
這么聲明之后,ProductsController 渲染的所有視圖都將使用 app/views/layouts/inventory.html.erb 文件作為布局。
要想指定整個程序使用的布局,可以在 ApplicationController 類中使用 layout 方法:
class ApplicationController < ActionController::Base
layout "main"
#...
end
這么聲明之后,整個程序的視圖都會使用 app/views/layouts/main.html.erb 文件作為布局。
運行時選擇布局:
可以使用一個 Symbol,在處理請求時選擇布局:
class ProductsController < ApplicationController
layout :products_layout
def show
@product = Product.find(params[:id])
end
private
def products_layout
@current_user.special? ? "special" : "products"
end
end
布局繼承:
布局聲明按層級順序向下順延,專用布局比通用布局優先級高。例如:
application_controller.rb
class ApplicationController < ActionController::Base
layout "main"
end
posts_controller.rb
class PostsController < ApplicationController
end
special_posts_controller.rb
class SpecialPostsController < PostsController
layout "special"
end
old_posts_controller.rb
class OldPostsController < SpecialPostsController
layout false
def show
@post = Post.find(params[:id])
end
def index
@old_posts = Post.older
render layout: "old"
end
# ...
end
在這個程序中:
- 一般情況下,視圖使用 main 布局渲染;
- PostsController#index 使用 main 布局;
- SpecialPostsController#index 使用 special 布局;
- OldPostsController#show 不用布局;
- OldPostsController#index 使用 old 布局;