我有三个关系,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中是如何工作的。你觉得那会是怎么回事?)
答案 0 :(得分:1)
*验证**
有两件事需要考虑:
- 您可以验证通往独特字段的方式
- 您可以在数据库中使用索引
醇>
第一步是确保您没有超出您想要的范围填充您的收藏。您可以通过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
#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
,但这是您需要做的基础