如何使用" - "关于rails中的数据库关系

时间:2014-06-30 02:16:20

标签: ruby-on-rails database

我有三个关系,user,shopping_list和item。用户可以拥有多个购物清单,购物清单可以容纳多个商品。规则是购物清单只能容纳一种物品,例如一个“电视”。

在我的网页上,我有一个位置,用户可以选择他/她想要添加项目的shopping_list。购物清单显示在下拉列表中,用户选择它。它工作正常,但它不遵循上面提到的规则。我想不显示购物清单,如果它已经持有该项目,但继续显示其余的。

这是我的关系

create_table "shopping_lists", force: true do |t|
    t.integer "user_id"
    t.integer "list_id"
    t.string  "name"
  end 


create_table "item", force: true do |t|
    t.integer "list_id"
    t.integer "item_id"
  end

如何构建我的查询,以便当我在页面上时,我只能获得尚未持有该项目的购物清单?

(我考虑过将user_id添加到'item'关系,然后我可以使用' - '运算符,我不确定它在rails中是如何工作的。你觉得那会是怎么回事?)

1 个答案:

答案 0 :(得分:1)

*验证**

有两件事需要考虑:

  
      
  1. 您可以验证通往独特字段的方式
  2.   
  3. 您可以在数据库中使用索引
  4.   

第一步是确保您没有超出您想要的范围填充您的收藏。您可以通过validating in the association

执行此操作
#app/models/list.rb
class List < ActiveRecord::Base
   has_and_belongs_to_many :items, uniq: true
end

#app/models/item.rb
class Item < ActiveRecord::Base
   has_and_belongs_to_many :lists, uniq: true
end

#lists_items
list_id | item_id

或使用indexes in you join table

#migration
add_index(:lists_items, [:list_id, :item_id], :unique => true)

-

<强>下拉

如果您有select框,则需要执行以下操作(使用.not):

collection_select(:item_ids, :item_id, Item.where.not("id IN (?)", current_user.list.map(&:item_id)), :id, :name_with_initial, prompt: true)

不确定如何定义列表id,但这是您需要做的基础