2011-11-27 66 views
1

除了this问题的帮助,我终于有了很多通过关系工作。有许多通过选择主键和外键

不幸的是,因为我正在使用遗留数据库,所以我无法使用默认的rails连接方法,因此需要更改列名称和字段值。

我有两个模型:raduser和radgroup,他们通过radusergroup加入。下面的模型。

我可以让连接使用键raduser_id和radgroup_id工作。我需要做的是分别将这些更改为用户名和组名。

不是表看起来像这样的:

+---------------------------+---------------------------+----------+----+ 
| raduser_id    | radgroup_id    | priority | id | 
+---------------------------+---------------------------+----------+----+ 
| 33      | 2       |  1 | 21 | 
| 33      | 1       |  1 | 20 | 
| 32      | 3       |  1 | 25 | 
+---------------------------+---------------------------+----------+----+ 

我需要它看起来像这样:

+---------------------------+---------------------------+----------+----+ 
| username     | groupname     | priority | id | 
+---------------------------+---------------------------+----------+----+ 
| jenny      | staff      |  1 | 21 | 
| steve      | sports     |  1 | 20 | 
| ianw      | travel     |  1 | 25 | 
+---------------------------+---------------------------+----------+----+ 

我试着在我的模型以下,但到目前为止,它是不成功的。

class Raduser < ActiveRecord::Base 
    has_many :radusergroup, :dependent => :destroy, :primary_key => :groupname, :foreign_key => :username 
    has_many :radgroup, :through => :radusergroup 
end 

class Radusergroup < ActiveRecord::Base 
belongs_to :raduser, :foreign_key => 'groupname', :primary_key => 'username' 
belongs_to :radgroup, :foreign_key => 'username', :primary_key => 'groupname' 
end 

class Radgroup < ActiveRecord::Base 
    set_table_name 'radgroup' 
    has_many :radusergroup, :dependent => :destroy, :primary_key => :groupname, :foreign_key => :username 
    has_many :raduser, :through => :radusergroup 
end 

什么是正确的方法来做到这一点?

- 更新 -

表单代码:

- Radgroup.all.each do |radgroup| 
    = check_box_tag "raduser[radgroup_ids][]", radgroup.id, @raduser.radgroup.include?(radgroup), :id => "raduser_radgroup_id_#{radgroup.id}" 
    = radgroup.groupname 

回答

2

你可能不希望一个ID列在您的连接表:

class CreateRadusergroups < ActiveRecord::Migration 
    def change 
    create_table :radusergroups, :id => false do |t| 
     t.integer :priority 
     t.string :username, :groupname 
    end 
    end 
end 

下面是如何设置型号:

class Raduser < ActiveRecord::Base 
    has_many :radusergroups, :foreign_key => :username 
    has_many :radgroups, :through => :radusergroups 
end 

class Radgroup < ActiveRecord::Base 
    has_many :radusergroups, :foreign_key => :groupname 
    has_many :radusers, :through => :radusergroups 
end 

class Radusergroup < ActiveRecord::Base 
    belongs_to :raduser, :foreign_key => :username 
    belongs_to :radgroup, :foreign_key => :groupname 
end 
+0

认为可行。在提交表单时,它仍然会输入ID。用表单代码更新了我的问题。我需要改变什么? Ĵ –