Rails 3 has_many: сквозное добавление идентификатора только со стороны отношения - PullRequest
1 голос
/ 19 января 2011

Я пытаюсь перейти от отношения has_many, own_to к has_many: через отношения с моей моделью Project и User.Однако, когда я тестирую его в консоли rails, в модели соединения, кажется, устанавливается только одна сторона отношения.

В настоящее время я настраиваю его так:

class Project < ActiveRecord::Base
  has_many :collaborations
  has_many :users, :through => :collaborations
end

class User < ActiveRecord::Base
  has_many :collaborations
  has_many :projects, :through => :collaborations
end

class Collaboration < ActiveRecord::Base
  belongs_to :project
  belongs_to :user
end

Затем вконсоль, которую я набираю:

me = User.find(1)

p = Project.new(:name => "somename")
p.users << me
p.save

И что происходит, так это то, что модель Collaboration получает набор project_id, но не user_id.

И происходит обратное (user_id устанавливается, но не project_id), когда я делаю что-то вроде этого:

me.projects << p

По сути, это создает «Сотрудничество», но только одну сторонуотношения спасаются.

Я застрял в этом в течение нескольких часов, и я чувствую, что это что-то незначительное - возможно, что-то осталось от того, когда я делал отношения один-ко-многим между этими двумя моделями.

--- Редактировать --- Вот как выглядит схема:

create_table "collaborations", :force => true do |t|
  t.integer  "project_id"
  t.integer  "user_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "projects", :force => true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.boolean  "shared",      :default => false
  t.integer  "position",    :default => 0
  t.string   "permalink"
  t.text     "description"
end

create_table "users", :force => true do |t|
  t.string   "username"
  t.string   "email"
  t.string   "crypted_password"
  t.string   "password_salt"
  t.string   "persistence_token"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "role"
  t.string   "first_name"
  t.string   "last_name"
  t.string   "perishable_token",  :default => "", :null => false
  t.integer  "avatar",            :default => 0
end

Любая помощь будет очень признательна!

1 Ответ

1 голос
/ 19 января 2011

Похоже, вы пытаетесь построить has_and_belongs_to_many отношения окольным путем. Ваша модель Collaboration выглядит точно так же, как модель соединения.

Я бы предложил пойти с правильными has_and_belongs_to_many отношениями. По сути, то, что вы имеете, станет:

class Project < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :projects
end

И тогда вам нужно будет создать миграцию для таблицы соединений:

def self.up
  create_table :projects_users, :id => false do |t|
    t.references :project, :user
  end
end

def self.down
  drop_table :projects_users
end

После этого вы сможете выполнить User.find(123).projects и Project.find(321).users, а также <<, который вы пытаетесь выполнить. Для дальнейшего объяснения того, как работает has_and_belongs_to_many, а также различных методов, которые вы можете использовать в ассоциациях, см. Документацию Rails .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...