【问题标题】:Rails 3 polymorphic associations; does a polymorphic to polymorphic association make sense?Rails 3 多态关联;多态到多态关联有意义吗?
【发布时间】:2012-06-13 02:28:28
【问题描述】:

在我的应用中,我有用户、学校(小组)和课程。我正在尝试建立一个模型,这三个模型中的任何一个都可以向任何其他模型发送请求,并为请求接收者提供接受或拒绝请求的选项。我的想法是建立一个多态到多态的关联,所以 rails 会识别 request_sender 和接收者的 id 和类型。我的第一个问题是,设置一个 poly to poly 表来实现这个功能是否有意义,或者我应该尝试一些不同的东西?如果一个 poly to poly 表有意义,我包括我当前的控制器和 db 表:

我为请求设置的数据库表是:

class CreateRequests < ActiveRecord::Migration
  def change
    create_table :requests do |t|

      t.belongs_to :request_sender, polymorphic: true
      t.belongs_to :requestable , polymorphic: true

      t.timestamps
    end

    add_index :requests, [:request_sender_id, :request_sender_type]
    add_index :requests, [:requestable_id, :requestable_type]
  end
end

这是我的请求控制器,我遇到的问题是定义方法来确定请求发送者和接收者的类:

def new
  @request = @requestable.requests.new
end

def create
  @request = @requestable.requests.new(params[:request])
  if @request.save
    redirect_to @requestable, notice: "requested."
  else
    render :new
  end
end

private
def load_requestable
  klass = [School, User, Course].detect { |c| params["#{c.name.underscore}_id"] }
  @requestable = klass.find(params["#{klass.name.underscore}_id"])
end

非常感谢任何帮助或指导,因为我是编程和 Rails 的新手,对我在做什么一无所知哈哈。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    当然,没有理由不能这样做。

    创建消息时,您需要发送创建者和接收者的 class_name 和 ID。因此,假设您的表单发送:

    • receiver_class
    • receiver_id
    • sender_class
    • sender_id

    然后,在您的 MessagesController 中

    def create
      message = Message.new.tap do |m|
        m.sender   = params[:sender_class].classify.constantize.find(params[:sender_id])
        m.receiver = params[:receiver_class].classify.constantize.find(params[:receiver_id])
        m.message  = params[:message]
      end
      if message.save
        redirect_to root_path, notice: "Awesome!"
      else
        render :new
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      相关资源
      最近更新 更多