2012-01-16 81 views
0

我创建了使用下面的语句实现了正到n关系的表:如何插入Rails中记录时没有模型和没有使用SQL

create_table :capabilities_roles, :id => false do |t| 
    t.integer :capability_id, :null => false 
    t.integer :role_id, :null => false 
end 

没有模型这张桌子。如何在不诉诸SQL的情况下插入记录?

我发现这个在ActiveRecord的:: ConnectionAdapters :: DatabaseStatements模块:

insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) 

也:

insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = []) 

我不知道是什么意思AREL。有人可以给我一个有效插入的例子吗?我想在其中使用诸如:role_id => Role.find_by_name('Business user')之类的内容。

+2

如果没有模型,你必须使用SQL。 – 2012-01-16 09:09:43

+0

创建模型有什么问题? – Henrik 2012-01-16 09:16:47

回答

1

如果您打算通过Rails操作数据库记录,那么应该有一个模型。只要创建你的模型目录role.rb与线

class Role < ActiveRecord::Base 
end 

而且你很乖。

+0

结合马克Tabler和塞尔吉奥Tulentsev的答案,我做了以下内容:我创建了内容的文件app /模型/ capabilities_role.rb: '类CapabilitiesRole <的ActiveRecord :: Base的 belongs_to的:能力 belongs_to的:角色 结束' – 2012-01-16 09:45:51

1

它看起来像是一个连接表,并且属于Capability和Role模型之间的许多关系。你应该让Rails为你处理它。首先定义所需的关联:

class Capability < ActiveRecord::Base 
    has_and_belongs_to_many :roles 
end 

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :capabilities 
end 

然后,只需添加角色模型的实例,以能力模型的实例的角色阵列(反之亦然):

capability.roles << role 
role.capabilities << capability 

从连接表中删除的记录是通过移除完成从一个数组对象:

capability.roles -= [role] 
+0

我遇到了这个问题,因为我试图编写迁移来迁移数据,而这个答案提供了一个很好的逻辑解决方案。 – 2013-09-12 05:51:01

0

在我们的项目中我们有没有模型中的许多表。为了实时生成活动记录模式,我们使用如下模块:

module EntityModel 
    module_function 
    ACCESS_MODELS = {} 

    def for(table_name) 
    return ACCESS_MODELS[table_name] if ACCESS_MODELS.has_key?(table_name.id) 
    ACCESS_MODELS[table_name] = create_access_model(table_name) 
    end 

    def create_access_model(table_name) 
    Class.new(ActiveRecord::Base) do 
     self.table_name = table_name 
    end 
    end 
end 

此创建匿名模型,并将其存储在提高性能的目的,全球哈希值。

用途为:

EntityModel.for(:users)