我们通过确保客户有足够的物品来开始操作。因此,我们首先在一个数组中收集他们当前的所有项目:
@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
应该添加的记录没有显示在数据库中。错误在哪里?
尝试
value = (start .. should_have).each do |v|
而不是
value = [start .. should_have].each do |v|
[start .. should_have]
将只返回一个包含单个range元素的数组。(start .. should_have)
将返回一个range,each
枚举器将按预期工作。
错误可能来自从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钩子。
尝试此代码,通过在循环中添加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
我不知道你在哪里使用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语句之外,以确保您总是在重新加载数组,如果不需要,请将其切换回来。