Rails Ассоциации: доступ к иностранным значениям через нестандартное имя - PullRequest
2 голосов
/ 23 декабря 2010

Мне пришлось нарушить соглашение Rails, чтобы удовлетворить потребности бизнеса, и это причиняет мне некоторую боль.Мое намерение состоит в том, чтобы иметь возможность ссылаться на стороннюю таблицу (через Rails) с помощью двух отдельных методов.

В типичном сценарии у вас будет что-то вроде этого:

<code>class Employee < ActiveRecord::Base
  belongs_to :company
end

class Company < ActiveRecord::Base
  has_many :employees
end
</Code>

Вы можетезатем обратитесь к компании через объект Employee, выполнив что-то вроде следующего:

e = Employee.find(1)
puts e.company.name

Это прекрасно работает для большинства таблиц, но, скажем, у нас есть таблица, подобная следующей:

<strong>id</strong> - integer
<strong>default_channel_id</strong> - integer and foreign key reference to channel table
<strong>selected_channel_id</strong> - integer and foreign key reference to channel table

Как показано, невозможно просто разрешить соглашению определять, как производится сопоставление, поскольку более одного столбца ссылаются на одно и то же значение внешнего ключа.

Я читал документацию Rails об ассоциациях , но я не нашел ничего, что позволило бы мне определять ассоциации таким образом.Самое близкое, что я получил, было через параметр: foreign_key, но он сам по себе не работал, потому что он создал единственный метод с каналом имени.Вот моя попытка:

class Foo < ActiveRecord::Base
  belongs_to :channel, :foreign_key => "default_channel_id"
  belongs_to :channel, :foreign_key => "selected_channel_id"
end

Как мне поступить?

Примечание: На всякий случай это помогает, я работаю с Ruby 1.9.2и Rails 3.0.3.

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

Определите ассоциации следующим образом:

belongs_to :default_channel, :class_name => "Channel"
belongs_to :selected_channel, :class_name => "Channel"

Это будет ссылаться на поле default_channel_id в вашей базе данных, чтобы загрузить ассоциацию default_channel, когда вы запросите ее, и я уверен, что с этой информацией вы сможете понять, что происходит, когда вы звоните selected_channel.

1 голос
/ 03 февраля 2012
class Foo < ActiveRecord::Base
  belongs_to :default_channel, :class_name => "Channel"
  belongs_to :selected_channel, :class_name => "Channel"
end

и

class Channel < ActiveRecord::Base
  has_many :default_channels, :foreign_key => 'default_channel_id'
  has_many :selected_channels, :foreign_key => 'selected_channel_id'
end
...