Как сохранить объекты ActiveRecord с одинаковым идентификатором отдельно в памяти - PullRequest
0 голосов
/ 11 декабря 2011

Рельсы 3.1 .Вот мои модели

class Cookbook
  has_many :recipes, :include => :ingredients
end

class Recipe
  belongs_to :cookbook
  has_many :ingredients
end

class Ingredient
  belongs_to :recipe
end

И у меня есть эти данные

Cookbook (id: 1)
  Recipe "Pizza" (id: 1)
    Ingredient "Tomato" (id: 1)
    Ingredient "Cheese" (id: 2)
  Recipe "Spaghetti" (id: 2)
    Ingredient "Tomato" (id: 1)
    Ingredient "Pasta" (id: 3)

Теперь давайте загрузим данные как объекты ActiveRecord

# Eager load all recipes and ingredients
cookbook = Cookbook.includes(:recipes).find(1)

pizza = cookbook.recipes[0]
tomato_for_pizza = pizza.ingredients.first

spaghetti = cookbook.recipes[1]
tomato_for_spaghetti = spaghetti.ingredients.first

Однако я бы хотелустановить флаг для одного из объектов ActiveRecord, но не хочу, чтобы он влиял на другой объект ActiveRecord с тем же идентификатором.

tomato_for_pizza.in_stock = true
tomato_for_spaghetti.in_stock     # true, but should be false (default)

Другими словами, я хочу объекты Ingredient (хотяони оба имеют одинаковый идентификатор и представляют одинаковые данные в базе данных) для загрузки в виде отдельных объектов в памяти.На языке RSpec

tomato_for_pizza.object_id.should_not == tomato_for_spaghetti.object_id

Мой вопрос: возможно ли это?Или есть другой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2011

Я думаю, вам нужно создать другую модель

class RecipeIngredients < ActiveRecord::Base
  belongs_to :recipe
  belongs_to :ingredient

  attr_accessible :in_stock
end

Надеюсь, что это ответ на ваш вопрос.

0 голосов
/ 11 декабря 2011

Вы можете клонировать объект, используя метод clone.Больше на ruby-doc.

Если вы клонируете нужный объект, клон будет содержать ту же информацию, но идентификатор_объекта будет другим

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