Переопределить методы атрибута ActiveRecord

Вы можете расширить PDO следующим образом:

class CustomPDO extends PDO {

    public function updateTable($sTable, array $aValues = array()){

        if (!empty($aValues) && !empty($sTable)){

            # validation of table / columns name
            $sTable = mysql_real_escape_string($sTable);

            $aColumns = array_map('mysql_real_escape_string',array_keys($aValues));

            $aElements = array();

            foreach ($aColumns as $sColumn){

                $aElements[] = "`$sColumn`= :$sColumn";

            } // foreach

            $sStatement = "UPDATE $sTable SET " . implode(',', $aElements);

            $oPDOStatement = $this->prepare($sStatement);

            if ($oPDOStatement){

                return $oPDOStatement->execute($aValues);

            } // if

        } // if

        return false;

    } // updateTable

}

# usage :
# $oDb->updateTable('tbl_name',$_POST);


# test

error_reporting (E_ALL);
ini_Set('display_errors',1);

$oDb = new CustomPDO('sqlite::memory:');

$oDb->exec('CREATE TABLE t1(c1 TEXT, c2 INTEGER)');

$oDb->exec("INSERT INTO t1(c1, c2) VALUES ('X1',1)");

var_dump($oDb->query('SELECT * FROM t1')->fetchAll(PDO::FETCH_ASSOC));

$oDb->updateTable('t1', array('c1'=>'f1','c2**2'=>2));

var_dump($oDb->query('SELECT * FROM t1')->fetchAll(PDO::FETCH_ASSOC));
147
задан Ajedi32 11 November 2014 в 15:36
поделиться

4 ответа

Повторение комментариев Gareth... Ваш код не будет работать, как записано. Это должно быть переписано этот путь:

def name=(name)
  write_attribute(:name, name.capitalize)
end

def name
  read_attribute(:name).downcase  # No test for nil?
end
208
ответ дан Aaron Longwell 11 November 2014 в 15:36
поделиться

В качестве расширения к ответу Аарона Лонгвелла вы также можете использовать «хеш-нотацию» для доступа к атрибутам, которые имеют переопределенные аксессоры и мутаторы:

def name=(name)
  self[:name] = name.capitalize
end

def name
  self[:name].downcase
end
91
ответ дан 23 November 2019 в 22:34
поделиться

У меня есть плагин rails, который заставляет переопределение атрибутов работать с super, как и следовало ожидать. Вы можете найти его на github .

Для установки:

./script/plugin install git://github.com/chriseppstein/has_overrides.git

Для использования:

class Post < ActiveRecord::Base

  has_overrides

  module Overrides
    # put your getter and setter overrides in this module.
    def title=(t)
      super(t.titleize)
    end
  end
end

Как только вы это сделаете, все будет работать:

$ ./script/console 
Loading development environment (Rails 2.3.2)
>> post = Post.new(:title => "a simple title")
=> #<Post id: nil, title: "A Simple Title", body: nil, created_at: nil, updated_at: nil>
>> post.title = "another simple title"
=> "another simple title"
>> post.title
=> "Another Simple Title"
>> post.update_attributes(:title => "updated title")
=> true
>> post.title
=> "Updated Title"
>> post.update_attribute(:title, "singly updated title")
=> true
>> post.title
=> "Singly Updated Title"
-1
ответ дан 23 November 2019 в 22:34
поделиться

В этой теме есть большая информация в http://errtheblog.com/posts/18-accessor-missing .

Длинный и короткий из них заключается в том, что ActiveReCord правильно обрабатывает Super Calles для ActivereCord Actorute Activents.

7
ответ дан 23 November 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: