记录未显示在数据库中

时间:2011-06-02 17:51:30

标签: ruby-on-rails ruby ruby-on-rails-3

我们通过确保客户有足够的项目来开始运营。因此,我们首先收集数组中的所有当前项:

@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

应添加的记录未显示在数据库中。 错误在哪里?

4 个答案:

答案 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挂钩。