ActiveRecord :: AssociationTypeMismatch,我错过了什么?

时间:2014-07-02 13:30:14

标签: ruby-on-rails activerecord

我在这里遗漏了一些东西:

价格等级:

class Price < ActiveRecord::Base

   has_many :diamonds

   scope :for_diamond, -> (diamond) { where("colour = ? AND clarity = ? AND weight_min < ? AND     weight_max > ?",
                                      diamond.color_code, diamond.clarity_code, diamond.carat_weight, 
                                      diamond.carat_weight).first }

    end
  end
end

钻石级:

class Diamond < ActiveRecord::Base

  belongs_to :price

  def self.import(file)
      CSV.foreach(file.path, headers: true) do |row|

      diamond = find_by_id(row["id"]) || new

      fields = row.to_hash

      diamond.price = Price.for_diamond(diamond)
      diamond.save!
    end
   end
  end

当我尝试设置钻石的价格时,使用范围Price.for_diamond,rails抛出价格(#70359514373040)预期,得到Price :: ActiveRecord_Relation(#70359514371980)

我的理解是,这是因为我的范围似乎是返回关系而不是动作记录。但是,我认为在范围中添加.first会解决这个问题。

另外,当我在控制台中尝试此操作时:

d = Diamond.last
d.price = Price.for_diamond(d)
d.save

它确实有用。

我错过了什么?

编辑:  我试过改变:     d.price = Price.for_diamond(d) 至:     d.price_id = Price.for_diamond(d)

没有错误,但仍然没有设置价格ID。

编辑:

尝试使用类方法而不是范围:

def self.price_for_diamond(diamond)
  Price.where("colour = ? AND clarity = ? AND weight_min < ? AND weight_max > ?",
                  diamond.color_code, diamond.clarity_code, diamond.carat_weight, 
                  diamond.carat_weight).first
end

但仍然没有运气。

0 个答案:

没有答案