【问题标题】:Rails 4 first_or_initialize sql double id "_id_id" sql generated by ArelRails 4 first_or_initialize sql double id "_id_id" sql 由 Arel 生成
【发布时间】:2015-03-25 07:00:53
【问题描述】:

我有一个简单的 Rails 4 first_or_initialize,它根据下面的tender.rb 文件中的注释在富连接表中创建条目。

# == Schema Information
#
# Table name: tenders
#
#  id                 :integer          not null, primary key
#  project_id         :integer          not null
#  company_id         :integer          not null
#  tender_awarded_at  :date
#
# Indexes
#
#  index_tenders_on_company_id          (company_id)
#  index_tenders_on_project_id          (project_id)

class Tender < ActiveRecord::Base
  belongs_to :project_id
  belongs_to :company_id
end

csv = CSV.new(data, {headers: true, header_converters: :symbol, col_sep: ','})
  csv.each do |line|
    unless line[:project_id].blank?
      project_id = line[:project_id].to_i
      company_id = line[:company_id].to_i
      tender = ::Tender.where(:project => project_id, :company => company_id).first_or_initialize

此脚本适用于仅通过匹配一个主键进行导入的其他导入。这是通过匹配两个非主键列来创建的。

PG::UndefinedColumn at /imports/tender
ERROR:  column tenders.project_id_id does not exist
LINE 1: SELECT  "tenders".* FROM "tenders" WHERE "tenders"."project

看起来 sql 是由 Arel @value 实例变量中的名称设置的。在此之前我在任何地方都看不到它。

<Arel::Nodes::Equality:0x007f8dd0d22318 @left=#<struct Arel::Attributes::Attribute relation=#<Arel::Table:0x007f8dd0ccb6d0 @name="tenders", @engine=Tender(id: integer, project_id: integer, company_id: integer, tender_awarded_at: date), @columns=nil, @aliases=[], @table_alias=nil, @primary_key=nil>, name="project_id_id">

任何想法如何解决这个问题?

【问题讨论】:

  • 你能从模型中添加关联吗
  • 嗯,这促使我查看我刚刚添加到问题中的 tender.rb 上的关系。我现在可以看到我添加了belongs_to :project_id 而不是belongs_to :projects。大概就是这个原因。我会解决的。

标签: ruby-on-rails ruby-on-rails-4 arel


【解决方案1】:
class Tender < ActiveRecord::Base
  belongs_to :project_id
  belongs_to :company_id
end

那是你的问题,你不指向列,你指向模型/类,正确的方法是

class Tender < ActiveRecord::Base
  belongs_to :project
  belongs_to :company
end

总是试着把这些关联读成英文,这很有意义,这里有一些例子

belongs_to :project # cause it's one
has_one :project
has_many :projects # cause it's many

【讨论】:

  • 我既喜欢又讨厌答案如此简单的问题:) 谢谢你的第二眼。
猜你喜欢
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2014-07-04
相关资源
最近更新 更多