1

Я следую руководству, сделанному для Rails 3, я использую Rails 3.2, но думаю, что правильно его соблюдаю, но получаю сообщение об ошибке. Мои классы следующие, и ошибка возникает, когда я использую , task.admin_users_tasksRuby on Rails Связь между 3-мя моделями

class Task < ActiveRecord::Base 

    attr_accessible :name, :project_id, :task_id, :permalink, :visible, :position, :created_at 
    belongs_to :project 
    has_and_belongs_to_many :admin_users 
    has_many :admin_users_tasks 
end 

class AdminUsersTask < ActiveRecord::Base 
    attr_accessible :admin_user_id, :task_id, :created_at, :updated_at 
    belongs_to :admin_user, :class_name => "AdminUser" :foreign_key => 'admin_user_id' 
    belongs_to :task 
end 

class AdminUser < ActiveRecord::Base 

    attr_accessible :first_name, :last_name, :username, :email 

    has_and_belongs_to_many :projects 
    has_and_belongs_to_many :tasks 
    has_many :admin_users_tasks 
    has_many :admin_users_projects 
end 

Rails Console

1.9.3-p362 :032 > task 
=> #<Task id: 1, project_id: 6, permalink: "taskytask", position: 1, visible: true, created_at: "2013-02-21 05:08:01", updated_at: "2013-02-21 05:08:01", name: "Task Name for Noname Project"> 
1.9.3-p362 :033 > me 
=> #<AdminUser id: 1, first_name: "Larry", last_name: "David", email:   "[email protected]", hashed_password: "c9f4e8d3aaa265033c2f517abd5d347bd81d67fa",  created_at: "2013-02-21 04:43:20", updated_at: "2013-02-21 04:43:20", username: "larrydavid",  salt: "d4189f8db685776d3a3c3c4d0700786b7879362d"> 
1.9.3-p362 :034 > me.admin_users_tasks 
=> [] 
1.9.3-p362 :035 > task.admin_users_tasks 
NoMethodError: undefined method `admin_users_tasks' for #<Task:0x007fca9e159f58> 
    from /Users/larrydavid/.rvm/gems/ruby-1.9.3-p362/gems/activemodel- 3.2.11/lib/active_model/attribute_methods.rb:407:in `method_missing' 
    from /Users/larrydavid/.rvm/gems/ruby-1.9.3-p362/gems/activerecord- 3.2.11/lib/active_record/attribute_methods.rb:149:in `method_missing' 
    from (irb):35 
     from /Users/larrydavid/.rvm/gems/ruby-1.9.3-p362/gems/railties- 3.2.11/lib/rails/commands/console.rb:47:in `start' 
    from /Users/larrydavid/.rvm/gems/ruby-1.9.3-p362/gems/railties- 3.2.11/lib/rails/commands/console.rb:8:in `start' 
    from /Users/larrydavid/.rvm/gems/ruby-1.9.3-p362/gems/railties- 3.2.11/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
from script/rails:6:in `<main>' 
1.9.3-p362 :036 > 
+1

ли перезапуске рельсы консоли, так добавив, что 'has_many: admin_users_tasks' ассоциации? –

+0

Спасибо, я не перезапустил консоль. – user1900791

+0

На консоли также есть команда 'reload', которая обычно выполняет трюк. – Cluster

ответ

0

Этот код немного неудобно, в основном потому, что вы используете синтаксис HABTM наряду с предоставлением модели, которой ваш должен делать с has_many: через. Я бы установил модели по-разному, а затем рельсы могли быть немного менее запутаны.

class Task < ActiveRecord::Base 
    has_many :admin_users_tasks 
    has_many :admin_users, :through => :admin_users_tasks 
end 

class AdminUser < ActiveRecord::Base 
    has_many :admin_users_tasks 
    has_many :tasks, :through => :admin_users_tasks 
end 

class AdminUserTasks < ActiveRecord::Base 
    belongs_to :admin_user 
    belongs_to :task 
end 

HABTM для когда вы хотите много-много присоединиться, и там, где у вас нет модели для присоединения таблицы, только 2 колонки для каждой стороны соединения. Нет идентификаторов или временных меток.

has_many: through is for, когда вы хотите присоединиться к Many-Many, и есть модель для таблицы join, что делает ее фактически двойной многочленом, а таблица join имеет столбец id, временные метки, вдоль с двумя внешними ключами.

Также, взглянув на ваш код, вы делаете то же самое с AdminUser и Project, если есть модель AdminUserProject, соединяющая эти две модели, используйте has_many: через не HABTM.

+0

Спасибо за информацию, я должен применить это. Попытка разобраться во всех этих отношениях и типах оказывается трудной. – user1900791

+1

Это может быть сначала, как только вы привыкнете к соглашениям, это имеет больший смысл. Удачи :) – Cluster

0

Исправлена ​​ошибка. Во-первых, консоль не была перезапущена.

Во-вторых, в рельсах 3.2, что было,

belongs_to :admin_user, :class_name => "AdminUser" :foreign_key => 'admin_user_id' 

Должно быть

belongs_to :admin_user, class_name: "AdminUser", foreign_key: 'admin_user_id' 
+1

Фактически оба действительны, первая строка - это обычный синтаксис хэша в Ruby, вторая строка - это новый синтаксис Ruby 1.9, но он действителен только тогда, когда у вас есть символы для ключей, вам нужна первая строка с любыми другими тип ключа. – Cluster

+0

Ах ладно, не понял, что вы не могли их смешивать! имеет смысл. – user1900791

Смежные вопросы