我在这里遗漏了一些东西:
价格等级:
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
但仍然没有运气。