出于体验目的,我在rails控制台中输入以下内容。 我查询了一个任意项目并为其分配了category_id并调用“save”。 为什么在结果中没有任何变化(item的category_id仍然为null)?
(为清楚起见,省略了一些输出)
1.9.3-p327 :004 > i = Item.first
Item Load (0.2ms) SELECT "items".* FROM "items" LIMIT 1
1.9.3-p327 :005 > i.category_id =1
1.9.3-p327 :006 > i.save
(0.1ms) begin transaction
(0.1ms) commit transaction
=> true
1.9.3-p327 :007 > i
=> #<Item id: 1, title: "near", price: 1000.0, photos: nil, created_at: "2013-07-31 15:19:24", updated_at: "2013-07-31 15:51:46", user_id: nil, category_id: nil, location_id: 1>
还尝试了update_attributes
1.9.3-p327 :008 > i.update_attributes(:category_id => 1)
(0.1ms) begin transaction
(0.1ms) commit transaction
=> true
1.9.3-p327 :009 > i
=> #<Item id: 1, title: "near", price: 1000.0, photos: nil, created_at: "2013-07-31 15:19:24", updated_at: "2013-07-31 15:51:46", user_id: nil, category_id: nil, location_id: 1>
----------------------------------------------- -Edit ----------------------------
1.9.3-p327 :007 > i.price=50
=> 50
1.9.3-p327 :008 > i.save
(0.1ms) begin transaction
(0.3ms) UPDATE "items" SET "price" = 50.0, "updated_at" = '2013-07-31 21:28:33.643283' WHERE "items"."id" = 1
(229.6ms) commit transaction
=> true
尝试另一个属性“价格”,它的工作原理。 也就是说,rails阻止手动更改以“_id”结尾的属性,大概是为了保护外键?
任何人都可以证实吗?或者重现这个?
------------------------------------再次编辑--------- ------------------------ 附上模型
class Item < ActiveRecord::Base
attr_accessible :photos, :price, :title, :user_id, :category_id
attr_accessor :user_id, :category_id
belongs_to :user
belongs_to :category
belongs_to :location
end
答案 0 :(得分:2)
没看到您的上次更新。 是的,如果您使用
attr_accessor :user_id, :category_id
您无法在控制台中更改此值,因为您尝试这样做
attr_accessor是一个生成getter和setter的ruby方法,attr_accessible是一个Rails方法,允许你将值传递给一个质量赋值:new(attrs)或up update_attributes(attrs)。