8

カービルのように、created_atと日付を比較するために「等しい」述語が必要でしたが、モデルにcreated_atの日時があります(「2012-09-26」など)。

そこで、モデルに追加しました(キャストされた属性を追加し、古いcreated_at / update_at / deleted_atを削除するために:

ransacker :created_at do
    Arel::Nodes::SqlLiteral.new("date(items.created_at)")
end

ransacker :updated_at do
    Arel::Nodes::SqlLiteral.new("date(items.updated_at)")
end

ransacker :deleted_at do
    Arel::Nodes::SqlLiteral.new("date(items.deleted_at)")
end

# Hide some attributes for advanced search
UNRANSACKABLE_ATTRIBUTES = ["created_at", "updated_at", "deleted_at"]

def self.ransackable_attributes auth_object = nil
    (column_names - UNRANSACKABLE_ATTRIBUTES) + _ransackers.keys
end

しかし、クエリを確認すると(created_atは '2012-03-24'に等しい)、次のエラーが発生します。

NoMethodError (undefined method `name' for "date(items.created_at)":Arel::Nodes::SqlLiteral):

驚いたことに、それは「より大きい」と「より小さい」で動作します。このエラーが発生するのは「等しい」のみです。

私はすべてのモデルに対してこれをすべて作成し、60%が機能します(残りの40%はこのエラーが発生します)。

コンソールで:

irb(main):232:0> Item.search(:created_at_eq => Date.today.to_s).result
(Object doesn't support #inspect)

ご協力いただきありがとうございます

編集 :

:Item(:deleted_at false)を作成するdefault_scopeがあります

しかし、なぜエラーが発生するのかわかりません

4

3 に答える 3