这是一个令人沮丧的简单问题。我使用的是Rails3.1,并且有以下类:
class Job < ActiveRecord::Base
attr_accessor :active
attr_accessible :roleTagline, :projectTagline, :projectStartDate, :projectDuration, :postedStartDate,
:postedEndDate, :skillsRequired, :skillsPro, :experiencedRequired, :description, :active
scope :is_active, :conditions => {:active => 1}
validates :roleTagline, :presence => true,
:length => { :minimum => 5 }
validates :projectTagline, :presence => true,
:length => { :minimum => 5 }
belongs_to :job_provider
# def active=(act)
# @active = act
# end
end
在我的控制器中,我尝试使用mass assignment(activerecord构建帮助程序之一)创建作业,然后将“active”属性设置为1,然后保存作业。这是控制器代码:
def create
@job_provider = current_user.job_provider
@job = @job_provider.jobs.build(params[:job])
@job.active= 1 # debug logging @job.active here gives an empty string
if @job.save # etc.
我已经尝试了移除attr_访问器和编写自己的setter的所有组合,但是无论我做什么,似乎都找不到正确的组合,无法使属性保持在模型上。我不认为它是活动记录,因为即使在@job.save属性消失之前(使用调试日志记录)。我到处搜了一下,但不知道我做错了什么。有人能帮忙吗?
编辑:schema.rb from rake:
create_table "jobs", :force => true do |t|
t.string "roleTagline"
t.string "projectTagline"
t.date "projectStartDate"
t.integer "projectDuration"
t.date "postedStartDate"
t.date "postedEndDate"
t.string "skillsRequired"
t.string "skillsPro"
t.string "experiencedRequired"
t.string "description"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "active"
t.integer "job_provider_id"
end
另一个编辑:
好吧,经过更多的谷歌搜索,我终于在这里找到了答案:
How can I override the attribute assignment in an active record object?
如果要修改activerecord属性而不是类实例,则需要执行以下操作:
self[:fieldname]=值
最佳答案
从模型中移除attr_accessor :active
。它导致值保存在实例变量中,而不是通过attributes
散列保存到数据库中。您不必编写访问器,因为activerecord会根据active
列自动为您编写访问器。
它在调试日志中显示为空,因为它被初始化为nil。如果删除attr_访问器行并将数据库中的active
列更改为NOT NULL DEFAULT 0
,则它将初始化为0。即在activerecord migration或schema.rb中:null => false, :default => 0
。