2015-12-13 16 views
5

Bằng cách nào đó có thể sử dụng lại fragments?Các mảnh vỡ tái sử dụng

Trong một ví dụ như thế này

def unpublished_by_title(title) do 
    from p in Post, 
    where: is_nil(p.published_at) and 
      fragment("downcase(?)", p.title) == ^title 
end 

Nó có vẻ như nó sẽ rất thuận tiện để có thể trích xuất đoạn phần vào một chức năng riêng biệt để nó có thể được tái sử dụng ở những nơi khác, ví dụ:

def unpublished_by_title(title) do 
    from p in Post, 
    where: is_nil(p.published_at) and 
      downcase(p.title) == ^title 
end 

def downcase(title) do 
    fragment("downcase(?)", ^title) 
end 

tuy nhiên, sau khi thử nhiều biến thể khác nhau, có vẻ như điều này sẽ không hoạt động do mở rộng macro hoặc tương tự như vậy. Bất kỳ ý tưởng?

Trả lời

5

Bạn nói đúng, các truy vấn được soạn thảo tại thời gian biên dịch. Bởi vì điều này, nếu bạn muốn mở rộng cú pháp truy vấn, bạn cần định nghĩa các macro thay vì các hàm thông thường.

giống như sau nên làm như lừa:

defmacro downcase(field) do 
    quote do 
    fragment("downcase(?)", unquote(field)) 
    end 
end 

Hãy nhớ rằng bạn cần phải xác định vĩ mô trước khi bạn sử dụng nó.

+0

Xin chào, cảm ơn đề xuất. Đáng buồn là tôi đã thử điều này và nó đã không làm việc ra, tôi đã viết về một lý do có thể có trong phần cập nhật của câu hỏi. – ave

+2

@ave hoạt động hoàn hảo cho tôi. Bạn có chắc chắn rằng macro được định nghĩa _above_ hàm sử dụng nó không? –

Các vấn đề liên quan