2010-09-02 71 views
4

最近我碰到了this messaging tutorial,並且被Struct.new的使用所吸引。從谷歌和SO的一些幫助,我已經瞭解了更多關於在Ruby中使用Struct,但我想知道更多關於它在Rails中的用法。在本教程中,有存儲用戶收到郵件的文件夾模式:使用Struct with Rails

class Folder < ActiveRecord::Base 
    acts_as_tree 
    belongs_to :user 
    has_many :messages, :class_name => "MessageCopy" 
end 

時會創建一個新的用戶創建的「收件箱」文件夾:

class User < ActiveRecord::Base 
    has_many :sent_messages, :class_name => "Message", :foreign_key => "author_id" 
    has_many :received_messages, :class_name => "MessageCopy", :foreign_key => "recipient_id" 
    has_many :folders 

    before_create :build_inbox 

    def inbox 
    folders.find_by_name("Inbox") 
    end 

    def build_inbox 
    folders.build(:name => "Inbox") 
    end 
end 

然而,「垃圾」文件夾是使用Struct.new創建的:

class MailboxController < ApplicationController 

    def index 
    @folder = current_user.inbox 
    show 
    render :action => "show" 
    end 

    def show 
    @folder ||= current_user.folders.find(params[:id]) 
    @messages = @folder.messages.not_deleted 
    end 

    def trash 
    @folder = Struct.new(:name, :user_id).new("Trash", current_user.id) 
    @messages = current_user.received_messages.deleted 
    render :action => "show" 
    end 
end 

使用Struct with Rails有什麼好處?爲什麼它在本教程中用於創建「垃圾」文件夾而不是「收件箱」文件夾(也可以在創建用戶時構建)?感謝您的幫助,我還沒有遇到太多網上關於什麼時候Struct可以/應該與Rails一起使用!

回答

3

毫無益處,只​​是它背後一定的推理:

  • 用戶可以根據自己的文件夾。
  • 本例中的垃圾是一個虛擬文件夾,它包含所有已被標記爲已刪除的消息。

爲了保持您的意見在兩種情況下工作,作者決定創建一個假文件夾對象(沒有所有活動記錄的東西,所以它不能被保存等)。然後他將它暴露給觀點。

<%= @folder.name %> 

然後將工作,無論是否是假文件夾或真正的文件夾。

+0

感謝您的意見,Struct in Rails的使用似乎並不普遍我猜測?它看起來對於無表模型最爲有用...... – Budgie 2010-09-02 13:36:16

+0

是的,它就像一個便捷類,當你只想存儲一些屬性並通過常規方法讀/寫它們時。否則哈希將起作用,但OStruct對於這種用例也很酷。 – 2010-09-02 14:37:52