"Магические" соединения Rails не работают - activerecord не находит записи в связанной таблице - PullRequest
0 голосов
/ 28 мая 2011

В моем приложении две модели: CompanyUk и CompanyName.CompanyUk имеет множество CompanyNames.Activerecord создает CompanyUk.CompanyNames, но не находит ни одного CompanyNames.Вот код:

class CompanyName < ActiveRecord::Base
  belongs_to :CompanyUk, :foreign_key => "company_number"
end

class CompanyUk < ActiveRecord::Base

  has_many :CompanyNames, :dependent => :destroy, :foreign_key => "company_number"

  validates_presence_of :company_number, :reg_office, :type, :incorporation_date #, :next_accounts_date, :next_return_date # should eventually have these

  validates_uniqueness_of :company_number, :case_sensitive => false

  validates_associated :CompanyNames

  set_inheritance_column :kind
end

class CreateCompanyUks < ActiveRecord::Migration
  def self.up
    create_table :company_uks do |t|
      t.string :company_number, :null=>false
      t.text :reg_office, :null=>false
      t.string :type, :null=>false
      t.string :business_nature
      t.string :status
      t.date :incorporation_date, :null=>false
      t.date :last_accounts_date
      t.date :next_accounts_date
      t.date :last_return_date
      t.date :next_return_date

      t.primary_key :company_number

      t.timestamps
    end
  end
end



class CreateCompanyNames < ActiveRecord::Migration
  def self.up
    create_table :company_names do |t|
      t.string :company_number, :null=>false
      t.string :name, :null=>false
      t.date :date_adopted, :null=>false

      t.timestamps
    end
  end
end

Содержимое базы данных:

irb(main):011:0> CompanyUk.all
=> [#<CompanyUk id: 1, company_number: "12345", reg_office: "Example office", type: "Private company limited by shares", business_nature: nil, status: nil, incorporation_date: "2011-05-28", last_accounts_date: nil, next_accounts_date: nil, last_return_date: nil, next_return_date: nil, created_at: "2011-05-28 09:47:19", updated_at: "2011-05-28 09:47:19">]

irb(main):012:0> CompanyName.all
=> [#<CompanyName id: 1, company_number: "12345", name: "foo ltd", date_adopted: "2011-05-28", created_at: "2011-05-28 09:47:19", updated_at: "2011-05-28 09:47:19">, #<CompanyName id: 2, company_number: "12345", name: "foo ltd", date_adopted: "2011-05-28", created_at: "2011-05-28 10:09:29", updated_at: "2011-05-28 10:09:29">, #<CompanyName id: 3, company_num
ber: "1", name: "foobar ltd", date_adopted: "2011-05-28", created_at: "2011-05-28 0:10:52", updated_at: "2011-05-28 10:10:52">]

Несмотря на наличие нескольких CompanyNames:

irb(main):009:0> CompanyUk.all.first.CompanyNames
=> []

Кроме того, создается новое CompanyNameчерез CompanyUk.CompanyNames неправильно устанавливает CompanyNumber (первичный ключ для CompanyUk и внешний ключ, установленный для отношений).

Итак, есть ли способ это исправить?Или, еще лучше, хороший справочник о том, как работают модели и ассоциации?

1 Ответ

1 голос
/ 28 мая 2011

Есть ли конкретная причина для того, чтобы идти против соглашения?

Например: this:

has_many :CompanyNames, :dependent => :destroy, :foreign_key => "company_number"

... должно быть:

has_many :company_names, :dependent => :destroy

..Пока миграция составляет:

class CreateCompanyNames < ActiveRecord::Migration
  def self.up
    create_table :company_names do |t|
      t.belongs_to :company_uk, :null=>false
      t.string :name, :null=>false
      t.date :date_adopted, :null=>false

      t.timestamps
    end
  end
end

Руководства по работе с миграциями и ассоциациями в Rails 3:

http://guides.rubyonrails.org/migrations.html

http://guides.rubyonrails.org/association_basics.html

Обратите внимание, что Rails в значительной степени полагается на соглашение по конфигурации , чтобы все работало как раз "Just Work (TM)".Нарушение этих соглашений, если в этом нет особой необходимости, часто может вызывать головную боль:)

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