2011-12-08 41 views
6

Tôi có hai bảng trong hai lược đồ khác nhau, ví dụ: casesevents.Rails Postgresql nhiều lược đồ và cùng một tên bảng

Trong mỗi schema Tôi có bảng cơ bản

  • events.basic
  • cases.basic

bảng này có quan hệ:

  • events.basic có một cases.basic (cases.basic có nhiều events.basic)

nỗ lực của tôi đã thất bại:

tập tin cases_basic.rb

class CasesBasic < ActiveRecord::Base 
    set_table_name 'cases.basic' 
    set_primary_key 'case_id' 
    has_many :Events, :class_name => 'EventsBasic', :foreign_key => 'case_id' 
end 

tập tin events_basic.rb

class EventsBasic < ActiveRecord::Base 
    set_table_name 'events.basic' 
    set_primary_key 'event_id' 
    belongs_to :Case, :class_name => 'CasesBasic', :foreign_key => 'case_id' 
end 

Môi trường: của Ruby 1.9.3, Rails 3.1.3, gem 'pg'

01.

Tôi Cần trả lời cho câu hỏi này:

  1. làm thế nào để xử lý tình trạng này trong Rails Active Record?
  2. cách truy vấn bảng này?
  3. làm thế nào để xử lý tình trạng này trong rake db:schema:dump

EDIT:

Sau khi thay đổi belongs_tohas_many (như tiếng huýt còi đề nghị) i có lỗi tương tự

PGError: ERROR: column basic.case_id does not exist 
LINE 1: ...IN "cases"."basic" ON "cases"."basic"."case_id" = "events"."... 
                  ^
: SELECT "events"."basic".* FROM "events"."basic" INNER JOIN "cases"."basic" ON "cases"."basic"."case_id" = "events"."basic"."case_id" LIMIT 3 

Rails tạo xấu SQL. Tôi nên sử dụng một số bí danh:

CHỌN t1. * TỪ "sự kiện". "Cơ bản" t1 INNER JOIN "trường hợp". "Cơ bản" t2 TRÊN t1. "Case_id" = t2. "Case_id" LIMIT 3


EDIT 2: Ok Đó là lỗi của tôi, tôi không thêm cột events.basic.case_id và khóa ngoại trong cơ sở dữ liệu mẫu của tôi. Nó hoạt động!


Câu hỏi 1 VÀ 2 đang hoạt động nhưng chúng tôi có câu hỏi về rake db:schema:dump thì sao? Đường ray tạo ra các mô hình chỉ cho lược đồ công khai.

Tôi có rất nhiều bảng và quan hệ mà tôi muốn tạo chúng.

+0

Sự kiện ': Events' và': Case' có thể là ': events' và': case' nhưng điều đó có thể sẽ không khắc phục được. –

+0

@muistooshort ': Events' và': Case' trông giống như bí danh và không được đưa đến SQL trong trường hợp này –

+0

Tôi hơi bối rối về những gì các bảng trông như thế nào, những gì nên các trường hợp "ON" "." Cơ bản " "case_id" = "sự kiện". "cơ bản". "case_id" 'tham gia điều kiện như thế nào? Một trong các bảng không có 'case_id' và đó là một vấn đề, bạn sẽ viết điều kiện kết nối đó như thế nào nếu bạn làm nó bằng tay? –

Trả lời

1

Check-out http://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/

này mô tả làm thế nào để cấu hình một ứng dụng Rails sử dụng một cơ sở dữ liệu Postgres với nhiều lược đồ. Ông thích tra cứu bảng với chức năng của đường dẫn Unix, bắt đầu với các vị trí cụ thể và quay trở lại các vị trí chung.

Khi đường dẫn lược đồ của bạn được tích hợp, bạn có thể truy vấn các bảng này thành công. db: schema: dump sẽ đọc các bảng sử dụng cùng một ưu tiên lược đồ mà ứng dụng của bạn thích.

+1

Cảm ơn bạn đã trả lời, nhưng tiếc là nó không giải quyết được vấn đề, tác giả sử dụng ở đây 'SET SEARCH_PATH TO schema1, schema2' cách tuyệt vời cho cơ sở dữ liệu đơn giản khi bạn không cần quan hệ giữa các bảng trong các lược đồ khác nhau. , bạn không thể tham gia các bảng có cùng tên. Và tôi có 300 bảng trong hệ thống của tôi, nơi nhiều người trong số họ có cùng tên. –

1

[Chỉnh sửa: sau khi đọc thêm, tôi không nghĩ rằng ActiveRecord hỗ trợ tốt nhiều lược đồ. Nhưng tôi có thể sai. Tôi sẽ để lại câu trả lời ở đây trong thời gian này, mặc dù nó gần như chắc chắn sai. (Khái niệm là đúng. Nhưng những người đã xây dựng ActiveRecord có lẽ đã không nói chuyện với bất kỳ cơ sở dữ liệu nào, bởi vì cơ sở dữ liệu mà mọi người có thể biết?) Có vẻ như IBM đang nghiên cứu vấn đề này trong năm 2008, nhưng tôi không thấy cách hoạt động đó kết thúc.]

PostgreSQL không gặp bất kỳ sự cố nào khi đặt tham chiếu khóa ngoài cho các bảng có cùng tên trong các lược đồ khác nhau. Mã số như thế này

class CasesBasic < ActiveRecord::Base 
    set_table_name 'cases.basic' 
    set_primary_key 'case_id' 
    has_many :Events, :class_name => 'EventsBasic', :foreign_key => 'case_id' 
end 

có thể cần phải đủ điều kiện lược đồ.

Bây giờ, không đúng là các trường hợp bảng.basic "có nhiều" sự kiện, phải không? Không, nó "có nhiều" event.basic. Thực hiện loại thay đổi đó trong cả hai lớp học của bạn và cho chúng tôi biết cách thức hoạt động của nó. (Không có Rails ở đây, hoặc tôi sẽ kiểm tra nó cho bạn.)

+0

"Nhưng những người xây dựng ActiveRecord có lẽ đã không nói chuyện với bất kỳ người cơ sở dữ liệu nào, bởi vì những gì mọi người có thể biết cơ sở dữ liệu?" DB người biết về những điều ngớ ngẩn như tính toàn vẹn tham chiếu (Rails nghĩ là một vấn đề ứng dụng). Rails có rất nhiều ý tưởng hay trong đó, ActiveRecord không phải là một trong số đó. –

+0

@muistooshort: Và các lược đồ. –

+0

Và ràng buộc CHECK, chỉ mục chức năng, trình kích hoạt, và bất cứ điều gì khác mà, nói, MySQL3 không hiểu. –

1

Tôi khuyên bạn nên sử dụng pg_power gem. Nó cung cấp cú pháp để tạo các lược đồ PostgreSQL trong các quá trình di chuyển như thế này:

def change 
    drop_schema 'demography' 
    create_schema 'politics' 
end 

Và cũng phải quan tâm đến việc lược bỏ các lược đồ vào tệp schema.rb một cách chính xác.

Các vấn đề liên quan