2012-07-01 6 views
1

Как создать динамическое имя переменной/объект?Rails: переменная экземпляра экземпляра для полиморфного контроллера/модели

У меня есть полиморфная модель для отправки запроса и присоединения моделей вместе после утверждения. Пример: пользователь может присоединиться к этo компании, проекту или группе.

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

profile.rb

class Profile < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :company 
    has_many :requests 
    has_many :requested, as: :requestable 

    attr_accessible :first_name, :last_name 


    validates :first_name, presence: true 
    validates :last_name, presence: true 

end 

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

Я надеялся, что с профилем @ @ принадлежит_to будет таким же, как @ profile.company, который в этом случае будет нил. Затем оттуда @ профиль. @ Принадлежит_to = @requestable

потому что профиль всегда будет принадлежать_ к модели, к которой он присоединяется @belongs_to, всегда будет именем модели в нижнем регистре.

Я уже возился с содержимым объектов, отправленных на флэш-сообщение, чтобы попытаться понять это.

requests_controller.rb

class RequestsController < ApplicationController 
before_filter :load_requestable 
    def accept 
     @request = Request.find(params[:id]) 
     @profile = Profile.find(@request.profile.id) 

     redirect_to [@requestable, :requests], notice: "#{@[email protected]_to} #{@request.profile.first_name} #{@request.profile.last_name} id: #{@request.profile.id} wants to join #{@requestable.name} id: #{@requestable.id}" 
    end 

    private 

    def load_requestable 
     klass = [Company, Profile].detect { |c| params["#{c.name.underscore}_id"]} 
     @requestable = klass.find(params["#{klass.name.underscore}_id"]) 
     @belongs_to = klass.to_s.downcase 
    end 
end 

Я играл в консоли с Somthing вдоль линий:

profile = Profile.first 
profile.company = Company.first 

и это создает объединение в объект, который может быть сохранен.

ответ

2

Если @belongs_to содержит ассоциацию вы можете простой вызов @profile.send(@belongs_to) или в случае уступки @profile.send("#{@belongs_to}=",@requestable)

#send позволяет отправить любое сообщение любому объекту в рубин. Подумайте о динамическом вызове метода.

И вы должны сделать

Смежные вопросы