Запрос ActiveRecord на методы модели - PullRequest
2 голосов
/ 25 июня 2011

Если у меня есть следующий код:

class User < ActiveRecord::Base
  has_many :problems

  attr_accessible :email, :password, :password_confirmation, :remember_me, :first_name, :last_name, :location, :address

  attr_internal_accessor :user_address

  def user_address
    self.address
  end

end

class Problem < ActiveRecord::Base
  belongs_to :user

  validates_presence_of :user_id, :title, :description, :tags
  delegate :address, :to => :user, :prefix => true

end

Когда я пытаюсь сделать это в AR, вот как выглядит вызов:

Problem Load (0.2ms)  SELECT "problems".* FROM "problems" ORDER BY problems.user_address asc LIMIT 20 OFFSET 0
SQLite3::SQLException: no such column: problems.user_address: SELECT  "problems".* FROM "problems" ORDER BY problems.user_address asc LIMIT 20 OFFSET 0
Completed 500 Internal Server Error in 173ms

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

Как я могу найти выходные данные, если эта функция, как если бы это был собственный столбец активной записи?

Ответы [ 2 ]

1 голос
/ 25 июня 2011

Предполагается, что метод user_address будет использоваться в коде (в основном представления), а не передаваться в AR.

AR потребует, чтобы БД поняла все.

Для сортировки (порядка) БД с использованием адресного столбца User #:

#Rails 3
p = Problem.includes(:user).order("users.address ASC").first
p.user_address

#Rails 2
p = Problem.find(:first, :include => :user, :order => "users.address ASC")
p.user_address

Также было бы целесообразно проверить, существует ли пользователь для проблемы, когда

def user_address
  self.user.try(:address) #just in case a problem doesn't have an associated user
end
1 голос
/ 25 июня 2011

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

Так что, если вы хотите получить ее адреса, что-то вроде:

def user_address
  Address.joins(:users).where(:user_id => user.id)
end

Таким образом, вы получаете ARвернитесь к объекту, и вы можете связать их.

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