我们通过确保客户有足够的项目来开始运营。因此,我们首先收集数组中的所有当前项:
@items = SOrder.where(:user_id => current_user.id).order("order")
然后我们确定他们应该拥有多少项目。如果有人有免费帐户,他们应该有5个项目。如果是付费帐户,则应该有20个项目:
if current_user.paid
should_have = 19 # one less than 20 because of 0 position in the array
else
should_have = 4
end
然后,如果我们需要添加空白记录,我们会找出应该从哪里开始:
if @items.empty?
start = 0
else
start = @items.length + 1
end
如果开头小于或等于某人应该拥有的,那么我们添加空白记录:
if start <= should_have
value = [start .. should_have].each do |v|
SOrder.create(:user_id => current_user.id, :order => v, :item_id => 0 )
end
@items = SOrder.where(:user_id => current_user.id).order("order") # reload array
end
应添加的记录未显示在数据库中。 错误在哪里?
答案 0 :(得分:2)
尝试
value = (start .. should_have).each do |v|
而不是
value = [start .. should_have].each do |v|
[start .. should_have]
将返回一个包含单个范围元素的数组。 (start .. should_have)
将返回一个范围,each
枚举器将按预期工作。
答案 1 :(得分:1)
我看不到你在哪里使用value
并且不确定你为什么要使用它。
你能用这个吗?:
if start <= should_have
(start .. should_have).each do |order|
SOrder.create(:user_id => current_user.id, :order => order, :item_id => 0 )
end
end
@str_order = SOrder.where(:user_id => current_user.id).order("order") # reload
编辑:我将@str_order移到你的if语句之外,以确保你总是重新加载数组,如果这是不希望的,只需将其切换回来。
答案 2 :(得分:1)
尝试使用此代码,以确保您的代码通过在循环中添加puts "entered the loop"
来进入创建记录的循环,如下所示:
if start <= should_have
(start .. should_have).each do |v|
puts "entered loop"
SOrder.create(:user_id => current_user.id, :order => v, :item_id => 0 )
end
@items = SOrder.where(:user_id => current_user.id).order("order") # reload array
end
如果正在打印“进入循环”,请尝试.create!
以确保所有验证都已通过(如果其中任何一个失败,将引发ActiveRecord错误,说明验证)
if start <= should_have
(start .. should_have).each do |order|
SOrder.create!(:user_id => current_user.id, :order => order, :item_id => 0 )
end
@str_order = SOrder.where(:user_id => current_user.id).order("order") # reload array
end
答案 3 :(得分:1)
错误可能来自于从Arel对象调用.length
而不是记录集。
@items = SOrder.where(:user_id => current_user.id).order("order").all
但是,由于您只需要计算第一个查询,我建议使用.count
。如果我写这篇文章,我会做类似的事情:
number_of_items = SOrder.where(:user_id => current_user.id).count
number_of_blank_items_to_add = current_user.allowed_items - number_of_items
if number_of_blank_items_to_add > 0
number_of_blank_items_to_add.times do |num|
SOrder.create(:user_id => current_user.id, :order => (number_of_items + num), :item_id => 0 )
end
end
@str_order = SOrder.where(:user_id => current_user.id).order("order")
在用户模型中:
def allowed_items
if paid
20
else
5
end
end
在用户模型中:
has_many :s_orders, :order => "s_orders.order asc"
def add_extra_blank_orders
number_of_items = s_orders.count
number_of_blank_items_to_add = allowed_items - number_of_items
if number_of_blank_items_to_add > 0
number_of_blank_items_to_add.times do |num|
s_orders.create(:order => (number_of_items + num), :item_id => 0 )
end
end
def allowed_items
if paid
20
else
5
end
end
在控制器中:
current_user.add_extra_blank_orders
@str_order = current_user.s_orders
虽然我确信你有充分的理由,但我在质疑为什么空白项目需要在数据库中。并且,如果可以在这里使用after_create挂钩。