我正在尝试从列表中删除项目。我有一个名为InvItem的表和另一个名为InvItemLoc的表。当我添加一个项目时,InvItem表的id被用作InvItemLoc表中的外键。但是当我删除一个项目时,子表格行不会被删除。现在我需要通过InvItem id生成一个InvItemLoc表的列表,该id目前在InvItem表中并且具有特定的组织。但是当我要检查它是否与带有InvItem表的InvItemLoc匹配时,它会给出这个错误 - > No row with the given identifier exists: [inv.InvItem#9666]
。现在有人可以帮我这个吗?!!!这是我在下面的尝试::
def items = InvItemLoc.findAllByAaOrgId(aaOrg)
List<InvItemLoc> found = new ArrayList<InvItemLoc>();
for(InvItemLoc item : items){
def invItem = InvItem.findById(item.invItemId.id)
if(!invItem){
found.add(item);
}
}
items.removeAll(found);
它在此行给出错误&gt;&gt;
def invItem = InvItem.findById(item.invItemId.id)
编辑::域
我的InvItemLoc域名如下&gt;&gt;&gt;
class InvItemLoc {
static mapping = {
...
}
Long id
InvItem invItemId
...
static constraints = {
...
}
}
InvItem域如下所示&gt;&gt;&gt;
class InvItem {
static mapping = {
...
}
Long id
...
static constraints = {
...
}
String toString() {
...
}
}
答案 0 :(得分:0)
您可以在域类之间创建one-to-many关联。当您删除父级时,Grails可以为您删除子级。 $ rake db:schema:load RAILS_ENV=production --trace
** Invoke db:schema:load (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:schema:load
-- enable_extension("plpgsql")
-> 0.1872s
-- create_table("users", {:force=>true})
-> 0.1565s
-- initialize_schema_migrations_table()
-> 0.0876s
$ heroku restart
Restarting dynos... done
$ heroku open
Opening appname... done
$ heroku pg:psql
---> Connecting to HEROKU_POSTGRESQL_WHITE_URL (DATABASE_URL)
psql (9.4.5, server 9.3.9)
appname::WHITE=> \d
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+----------------
public | schema_migrations | table | ownername
(1 row)
$ heroku run rails c
Running rails c on appname... up, run.1689
Loading production environment (Rails 4.1.6)
irb(main):001:0> ActiveRecord::Base.connection.tables
=> ["schema_migrations"]
irb(main):002:0>
需要添加InvItemLoc
静态属性,并删除belongsTo
属性。 invItemId
需要添加 hasMany 静态属性。
InvItem
这会改变域类的创建和保存方式。
class InvItemLoc {
...
static belongsTo = [item: InvItem]
}
class InvItem {
static hasMany = [locations: InvItemLoc]
...
}
简而言之,您将位置添加到项目中,然后保存该项目,从而保存位置。
然后,您可以像这样删除:def loc = new InvItemLoc()
// set loc properties.
def item = new InvItem()
item.addToLocations(loc)
// Set other item properties.
item.save()