Использование Struct с Rails - PullRequest
       0

Использование Struct с Rails

4 голосов
/ 02 сентября 2010

Недавно я наткнулся на это руководство по обмену сообщениями , и меня заинтриговало использование Struct.new.С небольшой помощью Google и SO я узнал немного больше об использовании Struct в Ruby, но я хотел бы узнать немного больше о его использовании в 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

Однакопапка 'trash' создается на лету с помощью 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 с Rails?Почему он используется в этом руководстве для создания папки 'trash', а не папки 'inbox' (которую также можно создать при создании пользователя)?Спасибо за помощь, я еще не слишком много слышал о том, когда Struct можно / нужно использовать с Rails!

1 Ответ

3 голосов
/ 02 сентября 2010

Никакой выгоды нет, есть лишь определенная причина:

  • Пользователь может иметь собственные папки.
  • Корзина в этом примере представляет собой виртуальную папку, в которой содержатся все сообщения, помеченные как удаленные.

Чтобы ваши представления работали в обоих случаях, автор решил создать объект поддельной папки (объект, в котором нет всех элементов активной записи, поэтому его нельзя сохранить и т. Д.) Затем он выставляет его на обозрение.

<%= @folder.name %>

будет работать независимо от того, является ли это фальшивой папкой или реальной папкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...