【问题标题】:use a different index column for loading models in rails 3使用不同的索引列在 rails 3 中加载模型
【发布时间】:2014-06-19 13:12:38
【问题描述】:

在我的应用中,用户可以将私人交易存储在他们的账户中,这些交易只有他们自己才能看到。

贸易模型如下所示:

class Trade < ActiveRecord::Base

  scope :by_user, lambda { |user|
    where(user_id: user.id) unless user.nil?
  }

  belongs_to :status
  belongs_to :user

路线如下所示:

resources :users do 
  resources :trades
end

所以生成像这样的url:

/users/:user_id/trades/:id/edit

目前例如,如果系统中存储了三笔交易,那么一个新用户在创建他的第一笔交易时将创建一个 id = 4 的交易,他的 URL 将是:/users/2/trades/4

我想让交易有一个新的sequence_number 列,并在 id 中使用它来查找交易。

所以每个用户将只能看到他/她的交易,并且它们都将从 1 开始编号。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 routes nested-routes


    【解决方案1】:

    要更改为路由传递的参数,首先在控制器中更改如何在给定:id 的情况下找到该交易参数的trade

    class TradeController < ApplicationController
      before_action :find_trade, only [:edit, :show, :update, :destroy]
      # Remove @trade = Trade.find(params[:id]) from those four actions
    
      private
        def find_trade
          @user = User.find params[:user_id]
          @trade = @user.trades.find_by sequence_number: params[:id]
        end
    end
    

    然后,在您的 Trade 模型中,将 sequence_number 设为您的新参数。

    class Trade < ActiveRecord::Base
      def to_param
        sequence_number
      end
    end
    

    模型的to_param 方法将在路由中为trades/:id 传递的参数从id 更改为sequence_number。因此,在上面的新用户示例中,显示他们的第一笔交易将是 /users/2/trades/1 而不是 /users/2/trades/4

    【讨论】:

    • 谢谢,在采取之前的行动的好主意。为什么你只将它与editshow 操作一起使用?你不能也为updatedestroy 做吗?
    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多