使用非id列查询数据库

时间:2012-04-15 18:29:43

标签: ruby-on-rails

我认为这是一个非标准的模型结构(我知道它很糟糕,但它是必要的)。鉴于以下迁移:

create_table :MODELS, :primary_key => :MOD_ID do |t|
  t.integer :MOD_ID
  t.integer :MOD_MFA_ID
  t.integer :MOD_CDS_ID
  t.integer :MOD_PCON_START
  t.integer :MOD_PCON_END
  t.integer :MOD_PC
  t.integer :MOD_CV
  t.integer :MOD_AXL
  t.binary :MOD_PC_CTM
  t.binary :MOD_CV_CTM

  t.timestamps

MOD_MFA_ID对应于与另一个表/模型(manufacturers)的关联。我想根据制造商的品牌栏检索模型。

  def getmanufacturer 
    @manufacturer = Manufacturers.find(params[:manufacturer])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @manufacturer }
    end
  end

我无法弄清楚如何修改我的控制器和路由来处理这个用例。我想使用此类或网址查询应用:/models?manufacturer=audi&&model=a6

2 个答案:

答案 0 :(得分:3)

所以说你想要一个像:

这样的网址

/制造/奥迪/模型/ A6

路径文件中的

执行:

resources manufactures do
  resources models
end

对于您想要切换主键的模型

制造商型号:

set_primary_key :manufacturer_name #what ever you want used instead of ID

为您的MODEL模型做同样的事情

set_primary_key :MOD_Name

然后在你的控制器中你可以这样做:

Manufacturer.find(params[:manufaturer_id]).models.find(params[:id])

如果您不想切换主键,也可以执行find_by:

Manufacturer.find_by_manufacturer_name("Audi").models.find_by_model_name("a6")

答案 1 :(得分:0)

如果您正在迁移并正在创建新数据库,那么您应该创建一个标准数据库。我了解您是否要连接到无法设计的数据库。我还会使用小写字母作为字段名称。

如果您希望MFA_BRAND成为主键,则可以在班级中设置主键。假设您希望MFA_ID成为主键,那么您可以将其添加到您的类中:

class Model < ActiveRecord::Base
  set_primary_key "MFA_ID"
end

这将更改find​​和to_param方法以使用主键字段。

但是,假设您不想更改主键,但有时想要通过MFA_BRAND进行搜索,那么您需要将MFA_BRAND值作为CGI参数传递。首先设置路线为

resources :models do
  collection do
    get :getmanufacturer
  end
end

当您需要路径助手时,请按以下方式调用:

getmanufacturer_models_path(:manufacturer => "Acme")

网址为

/models/getmanufacturer?manufacturer=Acme