ruby on rails-数据库中没有显示记录



我们通过确保客户有足够的物品来开始操作。因此,我们首先在一个数组中收集他们当前的所有项目:

@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语句之外,以确保您总是在重新加载数组,如果不需要,请将其切换回来。

相关内容

  • 没有找到相关文章

最新更新