Модельные ассоциации - PullRequest
0 голосов
/ 14 апреля 2010

У меня есть две модели библиотеки и книги. В моей модели библиотеки у меня есть массив - book_ids. Первичный ключ модели книги - ID.

Как мне создать отношение has_many: books в моей модели библиотеки?

Это устаревшая база данных, которую мы используем с рельсами.

Спасибо.

Ответы [ 3 ]

1 голос
/ 15 апреля 2010

Ваша схема базы данных на самом деле не соответствует предписанным соглашениям Rails, поэтому вам, вероятно, будет трудно заставить работать ассоциацию has_many по умолчанию. Вы пробовали возиться с пользовательскими опциями SQL, думая об этом?

Если вы не можете заставить работать встроенную ассоциацию has_many, вам придется свернуть свою собственную. Я бы определил методы books и books= в вашей модели Библиотеки, и внутри них установил бы виртуальный атрибут, который вы затем сохраните в виде массива в базе данных. Возможно, что-то вроде этого:

class Book > ActiveRecord::Base; end

class Library > ActiveRecord::Base

  before_save :serialize_books

  def books
    @books || nil
  end

  def books=(new_books)
    @books = new_books
  end

  private
  def serialize_books
    @attributes['books'] = "[" + @books.collect {|b| b.id }.join(',') + "]"
  end
end

То, что там не будет извлекать данные. Если вы хотите пойти еще дальше и поддерживать операции поиска с одним запросом, вы можете использовать некоторый пользовательский SQL в области видимости или переопределить поиск и добавить его к параметрам по умолчанию. Прокомментируйте, если вы хотите помочь с этим!

0 голосов
/ 15 апреля 2010

Рассмотрите возможность использования: метод сериализации с ActiveRecord:

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002284

это может делать то, что вы хотите

0 голосов
/ 14 апреля 2010

Если вы хотите использовать has_many, вы можете использовать опции: counter_sql и: finder_sql, используя синтаксис MySQL LIKE или REGEX. Но, вероятно, лучше сначала загрузить модель Libary, а затем проанализировать столбец book_ids и загрузить книги или непосредственно создать запрос с этой строкой.

...