использование "self" в объявлении ассоциации (: has_many,: has_one) - PullRequest
2 голосов
/ 30 декабря 2010

Мне нужно сослаться на собственную модель в объявлении: has_many.

У меня есть класс, который мы назовем Foo.Foo: has_many Bar.Foo имеет логический атрибут randomize, который определяет порядок столбцов в отношении: has_many.Если randomize имеет значение true, то они упорядочиваются по «RAND ()» или «RANDOM ()» в зависимости от БД.Если нет, они упорядочены по id.Я должен сделать это заявление об ассоциации, потому что я использую нетерпеливую загрузку.Мне хорошо известно, что я могу определить метод в Foo, который возвращает то, что я хочу, но мне нужно, чтобы все загружалось сразу, иначе 400-500 запросов выполняются по отдельности = плохо.

class CreateFoo < ActiveRecord::Migration
  def self.up
    create_table :foos do |t|
      t.string :name
      t.boolean :randomize, :default => false
    end
  end
end

class CreateBar < ActiveRecord::Migration
  def self.up
    create_table :bars do |t|
      t.string :name
      t.references :foo
    end
  end
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

class Foo < ActiveRecord::Base
  # this is the line that doesn't work
  has_many :bars, :order => self.randomize ? 'RAND()' : 'id'
end

Как получить доступ к свойствам self в объявлении has_many?

Вещи, которые я попробовал и потерпел неудачу:

  1. создание метода Foo, который возвращает правильную строку
  2. создание лямбда-функции
  3. crying

Возможно ли это?

Похоже, проблема в том, что "self" в: has_many ISN'T типа Foo:

undefined method `randomize' for #<Class:0x1076fbf78>

равно единице.из ошибок, которые я получаю.Обратите внимание, что это общий класс, а не объект Foo ... Почему ??

Ответы [ 3 ]

2 голосов
/ 30 декабря 2010

Оказывается, Райан Бейтс затронул похожую тему здесь в Railscast. Вам нужно определить область действия ПОСЛЕ метода ...

0 голосов
/ 30 декабря 2010

Я в этом контексте - это класс.

Чтобы сделать то, что вам нужно, вы можете попробовать пройти лямбду.

class Foo < AR::Base
  has_many :bars, :order => lambda { self.randomize? ? 'RAND()' : 'id'  }
end

Я не проверял это, но оно должно работать.

0 голосов
/ 30 декабря 2010

Попробуйте использовать область по умолчанию вместо в объявлении has_many

class Bar < ActiveRecord::Base
  default_scope lambda { order(self.randomize ? 'RAND()' : 'id') }

Но чтобы ответить на ваш вопрос напрямую, self в объявлении has_many ссылается на класс Foo, а не на экземпляр Foo.

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