Вызовите метод child или приведите родительский метод к child в Rails - PullRequest
1 голос
/ 24 марта 2010
I have some STI structure like following:

class Assignment < ActiveRecord::Base 
  has_many :criteria, :class_name => "Criterion", :order => :position
end

class Criterion < ActiveRecord::Base
  # Represents a criterion used to mark an assignment that
  # being the super class for all different criterias
  set_table_name "criteria" # set table name correctly
  belongs_to  :assignment
  validates_associated :assignment, :message => 'association is not strong with an assignment'
  validates_presence_of :assignment_id
  validates_numericality_of :assignment_id, :only_integer => true, :greater_than => 0, :message => "can only be whole number greater than 0"
  validates_uniqueness_of :criterion_name, :scope => :assignment_id, :message => 'is already taken'
  validates_presence_of :criterion_name,:assignment_id
end

class FlexibleCriterion < Criterion
  has_one :flexible_criterion_attribute, :class_name => "FlexibleCriterionAttribute"
  accepts_nested_attributes_for :flexible_criterion_attribute
  default_scope :include => :flexible_criterion_attribute
end

class FlexibleCriterionAttribute < ActiveRecord::Base
  belongs_to  :criterion, :class_name => "FlexibleCriterion"
  validates_presence_of :max
  validates_numericality_of :max, :message => "must be a number greater than 0.0", :greater_than => 0.0

  DEFAULT_MAX = 1

end

Хорошо, я загрузил свои текущие рабочие коды. Итак, в основном проблема заключается в следующем: Когда я использую метод, такой как criterion = assignment.criteria.find_or_create_by_criterion_name ("AAA"), я получаю объект критерия. Но я хочу привести этот объект к FlexibleCriterion, чтобы я мог присвоить значение Criterion. Flexible_criterion_attribute

Thx in advance!

1 Ответ

1 голос
/ 24 марта 2010
  1. Если assignment.criteria.find_or_create_by_criterion_name("AAA") возвращает запись, в которой столбец type имеет значение FlexibleCriterion, он автоматически приведёт объект к FlexibleCriterion.
  2. Если вы хотите убедиться, что возвращается только FlexibleCriterion, измените искатель следующим образом: assignment.criteria.find_or_create_by_criterion_name_and_type("AAA", 'FlexibleCriterion')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...