Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在Rails 3+;博士后?_Mysql_Ruby On Rails 3_Postgresql_Boolean_Coalesce - Fatal编程技术网

Mysql 如何在Rails 3+;博士后?

Mysql 如何在Rails 3+;博士后?,mysql,ruby-on-rails-3,postgresql,boolean,coalesce,Mysql,Ruby On Rails 3,Postgresql,Boolean,Coalesce,在我的模型中,我进行了以下自定义sql查询: SELECT training_courses.id, training_courses.training_id, training_courses.course_id, training_courses.is_pre_test, training_courses.order_by, training_course_histories.id AS training_course_history_id,

在我的模型中,我进行了以下自定义sql查询:

SELECT
    training_courses.id,
    training_courses.training_id,
    training_courses.course_id,
    training_courses.is_pre_test, 
    training_courses.order_by,
    training_course_histories.id AS training_course_history_id, 
    training_course_histories.finished_at,
    training_course_histories.score,
    CAST(coalesce(user_training_courses.id, 0) as BOOLEAN) as purchased
FROM
    training_courses
    LEFT OUTER JOIN training_course_histories
        ON training_course_histories.training_course_id = training_courses.id AND training_course_histories.id = (
            SELECT th1.id
            FROM training_course_histories th1      
            WHERE th1.training_course_id = training_courses.id
              AND th1.finished_at IS NOT NULL
              AND th1.user_id = 1
            ORDER BY th1.finished_at DESC LIMIT 1
        )
    LEFT OUTER JOIN user_training_courses
        ON user_training_courses.training_course_id = training_courses.id AND user_training_courses.id = (
            SELECT th2.id
            FROM user_training_courses th2          
            WHERE th2.training_course_id = training_courses.id 
              AND th2.user_id = 1
        )
WHERE (training_courses.training_id = 1)
GROUP BY
    training_courses.id,
    training_courses.id,
    training_courses.training_id,
    training_courses.course_id,
    training_courses.is_pre_test, 
    training_courses.order_by,
    training_course_histories.id,
    training_course_histories.finished_at,
    training_course_histories.score, 
    user_training_courses.id
ORDER BY 
    order_by ASC, 
    id ASC, 
    training_courses.order_by ASC, 
    training_courses.id ASC
以前,我使用的是Mysql数据库,所以,一点问题都没有,查询结果是:
ISNULL(user\u training\u courses.id)as purchased

但现在,我正在使用Postgres,我必须购买
CAST(coalesce(user\u training\u courses.id,0)作为布尔值

问题:对于Rails,purchased='t'或'f'(字符串)

我想要的:购买=真或假(布尔值)

可能吗


Thx.

Rails PostgreSQL驱动程序理解PostgreSQL布尔值的形式是
't'
'f'
,并且通常正确地翻译它们。您的演员阵容:

CAST(coalesce(user_training_courses.id, 0) as BOOLEAN)
也可以:

psql=> select cast(11 as boolean), cast(1 as boolean), cast(0 as boolean);
 bool | bool | bool 
------+------+------
 t    | t    | f
所以我猜Rails根本不知道你的演员阵容的类型。例如:

rails > ActiveRecord::Base.connection.select_rows('select cast(1 as boolean), 11 = 11')
 => [["t", "t"]]
您可以使用
ActiveRecord::ConnectionAdapters::Column
中的设置常量将
't'
'f'
转换为布尔值:

TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set
或者您可以使用:


但是,如果要使用低级SQL接口,您仍然需要知道所有列的类型,并手动进行排序。类似的问题也适用于整数、日期和任何其他返回的非字符串类型。

最后,我的模型中有一个访问器来处理这种情况

def purchased
  ![false, 'false', 'f', 'FALSE', 'F', 0, '0'].include?(self[:purchased])
end

强制转换为布尔值根本不起作用…:-(谢谢,这是一个很好的解决方案。我知道其他类型也会有类似的问题…所以我选择了另一种方法将“f”和“t”转换为布尔值。您最好使用
ActiveRecord::ConnectionAdapters::Column.value_to_boolean
def purchased
  ![false, 'false', 'f', 'FALSE', 'F', 0, '0'].include?(self[:purchased])
end