Простое соединение SQL в Rails - PullRequest
0 голосов
/ 22 июня 2011

У меня есть таблица пользователей и бильярдный стол.Таблица пользователей имеет столбец с именем facebook_id, который я хочу установить в качестве primary_key.У таблицы пулов есть столбец с именем creator_facebook_id.

Я хочу выполнить простое объединение, где users.facebook_id = pools.creator_facebook_id

Я пытаюсь сделать это с помощью активной записи, разместив следующуюкод в моих моделях

class Pool < ActiveRecord::Base
  belongs_to :user, :foreign_key => "facebook_id"
end

class User < ActiveRecord::Base
  has_many :pools, :foreign_key => "creator_facebook_id"
end

Тогда я, когда у меня есть список пулов, я хотел бы иметь возможность сделать что-то вроде этого

pool.user.name

и вернуть имя (хранится втаблица пользователей), связанная с пулом.Это должно быть довольно просто, где я иду не так?

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Если вы фактически установили facebook_id в качестве первичного ключа в таблице Users, вам нужно будет сообщить об этом Rails.Для ассоциаций доступен параметр :primary_key, поэтому вы можете использовать его в своей модели пула:

belongs_to :user, :primary_key => 'facebook_id', :foreign_key => 'creator_facebook_id'

. Это позволит вам использовать Pool.user.К сожалению, заставить ActiveRecord хорошо играть с нестандартными первичными ключами - это совсем другая проблема.Я предлагаю вам просто позволить этому сделать свое дело с колонкой id, являющейся первичным ключом, и добавить индекс для колонки facebook_id.

0 голосов
/ 22 июня 2011

Миграция:

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users, :primary_key => 'facebook_id' do |t|
      t.string :name
    end
  end

  def self.down
    drop_table :users
  end
end

class CreatePools < ActiveRecord::Migration
  def self.up
    create_table :pools do |t|
      t.integer :creator_facebook_id
      t.string :name
    end
  end

  def self.down
    drop_table :pools
  end
end

Модель:

class User < ActiveRecord::Base
  set_primary_key 'facebook_id'
  has_many :pools, :foreign_key => "creator_facebook_id"
end

class Pool < ActiveRecord::Base
  belongs_to :user, :foreign_key => "creator_facebook_id"
end

это позволит:

pool.user.name

протестировано с sqlite и рельсами 3.0.7

0 голосов
/ 22 июня 2011

Полагаю, вам не хватает имени класса.

class Pool < ActiveRecord::Base
  belongs_to :user, :class_name => 'User', :foreign_key => "facebook_id"
end

class User < ActiveRecord::Base
  has_many :pools, :class_name => 'Pool', :foreign_key => "creator_facebook_id"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...