Как сделать недействительными отношения has_many в Rails - PullRequest
0 голосов
/ 17 августа 2010

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

Так, например:

class Student
  has_many courses # may have a :condition clause or some such

  def some_method
    # For some reason, we want to change all courses in here, not
    # just a single row.
    ActiveRecord::Base.connection.execute("UPDATE courses SET location = #{new_location}")
    # Not sure if we'll later do anything with self.courses, so I need to invalidate
    # that relationship.  Could do self.courses.reload right here, but I don't want to
    # do the SQL if it isn't necessary; the cache only lasts until the end of the
    # current page request.
  end
end

Я вполне могу упустить что-то довольно очевидное.Некоторые гипотетические методы self.courses.invalidate.

Ответы [ 3 ]

5 голосов
/ 17 августа 2010

Нет в их общедоступном API, но вы можете попробовать метод сброса в AssociationCollection class .

Просмотр журнала:

s = Student.first
s.courses       # Hits db
s.courses       # Hits cache 
s.courses.reset # No db
s.courses       # Hits db
1 голос
/ 17 августа 2010

Расширение того, что я не мог сказать, в 140 символов ... Вы можете избежать необходимости аннулировать отношения, используя некоторые удобные методы Rails, которые прикреплены к ассоциации. Скажем, например, что у меня есть модель User и Project:

class Project < ActiveRecord::Base
  # Backing table has :id, :user_id, :name, and :description columns
end

class User < ActiveRecord::Base
  has_many :projects
end

user = User.first # Assuming you have some users already

# Creates a new project named "Some Project" with description "Some Description"
# and sets the project's user_id to user.id. Also handles in-memory user.projects
# updating.
user.projects.create(:name => "Some Project, :description => "Some Description")
0 голосов
/ 17 августа 2010

Вы должны взглянуть на встроенные методы update_attribute, которые обновляются через SQL, но имеют преимущество в изменении локальных атрибутов.

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