我有以下帮助方法:
def parse_potential_followers(params)
t_id = TestSet.where(:test_name => params[:test_set][:test_name]).pluck(:id)[0].to_i
screen_names = params[:potential_followers].first[1].split("\n").reject(&:blank?)
screen_names.each do |s|
potential_follower = PotentialFollower.new(
:screen_name => s,
:test_sets_id => t_id,
:status => 'new',
:slug => generate_slug([t_id.to_s, s])
)
potential_follower.save
end
end
问题在于,当我调用此方法时,如果在开发环境中的表中插入数据,则跳过test_sets_id,而不是在生产环境中。其他三个属性保存得很好。
所有属性都在potential_followers表中定义。
我还拥有potential_followers_controller.rb中potential_follower_params方法的所有属性:
def potential_follower_params
params.require(:potential_follower).permit(:screen_name, :test_sets_id, :connections, :status,
:slug, :created_at, :updated_at)
end
test_sets_id在表中定义为整数。我甚至尝试过编码t_id的值:
t_id = 12
但它仍然不适用于制作。
这是models / potential_follower.rb中的内容:
class PotentialFollower < ActiveRecord::Base
belongs_to :TestSet
end
这是test_sets_contoller.rb中的方法:
def create
@test_set = TestSet.new(test_set_params)
respond_to do |format|
if @test_set.save
parse_potential_followers(params)
format.html { redirect_to @test_set, notice: 'Test set was successfully created.' }
format.json { render :show, status: :created, location: @test_set }
else
format.html { render :new }
format.json { render json: @test_set.errors, status: :unprocessable_entity }
end
end
end
有什么想法吗?
答案 0 :(得分:1)
生产数据库可能没有字段test_sets_id
,但在生产模式下,rails仍会创建数据库记录,而忽略哈希的test_sets_id
字段。 rake db:migrate RAILS_ENV=production
应解决问题。
答案 1 :(得分:1)
你正在偏离Rails惯例。 belongs_to应该是蛇形和单数形式,即:
belongs_to :test_set
数据库列也应该是单数。因此,该列应重命名为test_set_id
。
belongs_to :test_set
声明的作用是它会在PotentialFollower上生成test_set_id=
(以及test_set=
方法)。这是Rails的惯例。一旦你更改了belongs_to,它现在应该成功地将值保存在开发和生产中。
请参阅http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to